IT技术博客大学习 共学习 共进步
首页 / 酷壳
IT 2011-10-17 22:28:50 / 累计浏览 4,800

那些曾伴我走过编程之路的软件

这篇讲的是作者从一张尘封的 VC++6.0 光盘出发,开启的一场个人编程软件怀旧之旅。文章并未停留在简单的软件罗列,而是借此追溯了从 Turbo C 2.0 到 Visual C++ 6.0 等经典工具如何陪伴他度过编程学习的早期岁月,以及这些工具背后所代表的技术演进脉络。 作者以轻松而略带感慨的口吻,反思了当年使用这些软件时的想法与如今视角下的差异,生动体现了技术变迁带来的冲击与趣味。尽管 Unix/Linux 作为其后期专长未在此展开,但早期 Windows 平台开发工具的点滴回忆已足以引发许多同行者的共鸣。 这篇文章像一位老朋友的叙旧,通过具体的软件细节与个人体验,让读者也能回溯自己的编程起点,感受技术世界日新月异中那些不变的初心与乐趣。

IT 2011-10-17 22:20:52 / 累计浏览 2,180

“品质在于构建过程”吗?

这篇讲的是作者在微博上参与的一场关于敏捷测试与质量保证的讨论。几位敏捷实践者正在争论测试与质量的角色定位,作者从“品质是否主要在于构建过程”这一疑问切入,分享了他更核心的看法:质量并非由测试环节“保证”而来,而是内嵌于每一次代码提交、设计决策和团队协作的构建过程中。 作者认为,如果将质量保障的责任过度集中于独立的测试阶段,容易导致团队协作的割裂与问题发现的延迟。相反,他倡导在敏捷实践中,将质量意识前置——通过持续集成、结对编程、自动化测试等手段,让开发人员、测试人员乃至产品经理在构建的每一个环节都共同对最终产品的品质负责。这种视角强调了“预防”优于“检测”,质量是团队共同建造出来的属性,而非事后检查出来的结果。 文章通过一场具体的技术讨论,揭示了敏捷实施中一个容易被忽视的思维转变:从依赖后期测试来“发现”缺陷,转向依靠严谨的构建过程来“避免”缺陷。对于正在推进敏捷转型的团队,这种关于责任归属与工程文化的思考,或许比任何具体工具都更能影响长期的交付质量。

IT 2011-09-21 13:39:28 / 累计浏览 4,940

如果你看不见你还能编程吗?

这篇讲的是一个源自StackOverflow的提问:盲人能否编程?作者坦言,初看觉得不可能,但高赞答案让他深受触动。 文章的核心,在于它打破了“编程必须依赖视觉”的惯常认知。它并非罗列技术方案,而是通过真实的问答社区内容,展现了视障程序员如何借助屏幕阅读器、命令行工具等非视觉交互方式,不仅实现了编程,甚至在许多技术领域表现出色。这些回答颠覆了作者的初始预期,也构成了文章最有力的内容支撑。 这个案例揭示了一个常被忽略的维度:技术的可用性与无障碍设计。它启发我们,编程的核心是逻辑与思维,其交互方式可以是多样的。对于开发者而言,思考如何让工具和环境更具包容性,或许是比实现功能更深远的挑战。

IT 2011-09-16 00:13:22 / 累计浏览 5,180

千万不要把 bool 当成函数参数

这篇讨论的是编程中一个常被忽略的代码坏味道:滥用 `bool` 类型作为函数参数。作者直接指出,这种做法会显著降低代码的可读性和可维护性。 文章从常见的编程实践切入,用具体的代码示例来论证其观点。当函数参数中出现 `true` 或 `false` 时,调用方的代码往往变成 `doSomething(true, false)` 这样难以理解的形式,其含义完全依赖于阅读者的记忆或去查阅函数定义。相比之下,通过枚举、策略模式或拆分为两个独立函数等方式,能够让代码的意图在调用处就清晰自明。作者通过对比,揭示了这种写法如何埋下沟通和维护的隐患。 这篇短文的价值在于,它将一个容易滑入的编码习惯明确标识为问题,并给出了清晰的改进思路。对于追求代码清晰度的开发者来说,这是一个及时且实用的提醒。

IT 2011-08-26 22:33:34 / 累计浏览 6,280

你会做Web上的用户登录功能吗?

这篇讲的是Web用户登录功能中那些容易被忽略的安全陷阱。作者从实际观察到的许多网站登录实现问题出发,指出这个看似基础的功能,实际做起来比想象中复杂。 文章首先拆解了常见的错误做法——比如前端明文传输密码、数据库使用明文存储、缺乏防护的暴力破解机制等。随后详细对比了安全实现的核心要素:必须使用HTTPS全站加密传输,后端密码存储需采用加盐哈希(如bcrypt),并设计合理的登录失败限流策略。同时,文章也提醒开发者关注会话管理(如HttpOnly、Secure标记的Cookie)和CSRF防护。 这些细节直接关系到用户数据安全。作者通过具体案例说明,省略任何一个环节都可能导致账户被批量入侵。文章结尾强调,登录模块是安全架构的第一道门槛,值得开发者用更严谨的态度来设计和实现。

IT 2011-08-26 22:23:22 / 累计浏览 8,000

C语言中史上最愚蠢的Bug

这篇讲的是一个号称“史上最愚蠢”的C语言Bug,但它却有着极强的迷惑性,以至于作者本人——一位经验丰富的开发者——都亲手写下了这段错误代码。文章揭示的这类错误通常源于一个微小的疏忽:可能是少写了一对括号,忽略了运算符优先级,或是对宏展开的理解出现了偏差。最令人“拍案惊奇”的是,这类Bug往往能通过编译,甚至在部分环境下“碰巧”正常工作,从而成为代码库中隐藏的定时炸弹。作者通过亲身经历提醒我们,无论经验多丰富,在C语言(乃至所有编程语言)的细节面前都需保持敬畏。真正的陷阱,常常就藏在我们认为“绝对不可能出错”的地方。

IT 2011-08-23 13:19:44 / 累计浏览 4,560

弱爆程序员的特征值

这篇讲的是弱爆程序员的典型特征值,作者从日常开发中的观察出发,用幽默的笔调列举了那些让代码质量大打折扣的坏习惯。文章指出,弱爆程序员常表现为过度依赖复制粘贴、忽视错误处理、缺乏单元测试,甚至代码结构像意大利面条一样混乱。每个特征都配有生动的例子,比如全局变量滥用、文档缺失、逃避代码审查,以及忽略性能优化和安全漏洞。这些细节让读者一目了然,看到这些行为如何增加项目的技术债务和维护成本。 作者强调,这些特征值不仅影响个人效率,还会拖累团队协作,导致项目健康度下降。通过分享这些发现,文章鼓励程序员进行自我反思,培养更好的编程习惯,例如采用自动化测试、注重代码可读性、主动参与代码审查。最终,避开这些陷阱能显著提升代码的可维护性,让开发流程更顺畅,团队合作更高效。文章以轻松的方式传递了严肃的教训,帮助开发者在笑声中成长。

IT 2011-08-19 23:14:53 / 累计浏览 3,380

在函数外存取局部变量的一个比喻

这篇讲的是C/C++中一个经典又容易踩坑的问题:为什么函数返回的局部变量地址会失效? 作者从StackOverflow上一段试图在函数外通过指针访问局部变量的代码出发,指出这种操作实际上触发了“未定义行为”。有趣的是,他没有直接罗列内存栈帧、作用域规则这些概念,而是用了一个巧妙的比喻:把函数的栈帧想象成一个“临时便签纸”。函数运行时,就在纸上写下局部变量的值;函数返回后,这张“纸”就被系统收回了,但指针p还傻傻地指着那张已经被擦除或准备覆盖的旧便签。所以通过p去读写,结果完全不可预测。 这种比喻把抽象的内存管理机制,变成了直观的生活经验。文章最终揭示的核心是:在栈上分配的生命周期,严格受限于函数的执行过程。理解这一点,就能自然避免那些“看起来对,实则危险”的编码习惯。

IT 2011-08-19 23:00:52 / 累计浏览 3,520

C++11 中值得关注的几大变化(详解)

这篇文章梳理了 C++11 带来的核心语言与库层面的变革。作者聚焦于那些能显著提升代码表达力与性能的新特性,比如右值引用与移动语义,它如何通过避免不必要的拷贝来优化资源管理;再如 lambda 表达式,它如何让匿名函数对象的使用变得直观简洁,极大方便了 STL 算法的调用。文章还对比了 C++11 的 `auto` 类型推断与旧版的手动声明,以及统一初始化列表相比传统构造方式的便利之处。通过具体的代码示例,清晰展示了这些特性各自的使用场景与解决的问题——例如,移动语义特别适用于资源密集型对象的传递,而 lambda 则非常适合需要短期回调函数的场合。对于已经熟悉 C++98/03 的开发者来说,这能帮助你快速抓住升级的重点,理解新标准如何让 C++ 编程变得更安全、更高效。

IT 2011-08-17 13:47:38 / 累计浏览 3,640

对象的消息模型

这篇讲的是面向对象编程中“对象之间如何通信”的核心模型——消息传递。作者从一个常见问题出发:对象之间是应该直接调用方法,还是通过发送消息来交互?文章深入对比了这两种思路。 直接方法调用简单直接,但让对象之间紧密耦合;而消息模型则更像人与人之间的对话,发送者不关心接收者如何处理,只发出请求。这种解耦带来了灵活性,也是许多现代框架(如React的组件通信、iOS的Delegate模式)的设计基础。 文章进一步探讨了消息传递的实现细节,比如同步与异步消息的区别、消息队列的引入如何应对高并发,以及在分布式系统中,消息模型如何成为微服务间协作的基石。作者用实例说明,选择哪种模型取决于场景:对性能要求极高的内部模块可能适合直接调用,而需要高度可维护性和扩展性的系统,则更倾向于清晰的消息契约。 理解对象消息模型,不仅是掌握一种设计模式,更是培养一种“通过契约而非实现来协作”的架构思维。

IT 2011-08-14 15:20:47 / 累计浏览 2,540

在新浪微博上关于敏捷的一些讨论

作者在发布对Scrum的质疑后,收到不少敏捷实践者通过微博发起的讨论邀请。他很欣赏这种开放交流的态度,但也直言不讳地准备给出自己的“板砖”式点评。 这篇文章记录的就是这些互动中的思考片段。作者从自己被频繁@的经历出发,坦率地回应了敏捷粉丝们提出的一些典型话题。他并未一味否定,而是基于实践观察,对敏捷特别是Scrum在实际落地中可能遇到的惯性、变形或效果不及预期的现象,提出了带有批判性的观察。 文中透露出一个关键视角:敏捷不是一套僵化的仪式,而需要根据团队和环境进行真正的适配。作者准备挑战的,或许正是那些被机械执行、却未能带来实效的“敏捷实践”。对于那些在推行敏捷时感到困惑或收效甚微的团队,这篇文章中针对具体讨论的反思,或许能提供一些跳出框架的思考角度。

IT 2011-08-03 13:53:26 / 累计浏览 5,120

10个必需的iOS开发工具和资源

这篇推荐聚焦iOS开发中那些“省时省力”的必备工具与资源,作者从界面设计、图标素材、学习教程到调试抓包,给出了一个颇为实用的清单。 文章首先用Omnigraffle搭配iPhone Stencil快速搭建原型,用Glyphish Icons解决图标设计难题,还分享了teehan+lax提供的免费iPhone 4 GUI PSD模板——这些资源能直接加速UI设计流程。在学习路径上,作者力荐斯坦福大学的官方iOS开发课程,并特别指出国内有带字幕的版本。对于想尝试游戏开发的读者,71 Squared网站被描述为资源极其丰富的起点,甚至成功游戏《Tiny Wings》的开发者也是从这里起步。最后,工具如Charles网络代理和ASIHTTPRequest库,能有效解决iOS开发中调试网络请求的痛点。 值得注意的是,作者在开篇便坦言iOS界面开发之不易,并穿插了对平台生态的思考,认为高门槛或许反而提升了应用整体质量。整篇文章推荐具体,工具链覆盖设计、学习到调试,像一位同行在分享自己的实用工具箱,适合开发者快速查漏补缺。

IT 2011-07-21 23:58:20 / 累计浏览 6,020

面向对象的Shell脚本

这篇讲的是一个挺有意思的脑洞:在原本与“面向对象”八竿子打不着的Shell脚本里,硬生生地实现了一套类与对象的体系。文章从那个著名的、用正则表达式检查素数的奇技淫巧说起,引出编程世界中总有人乐于挑战不可能,然后直接点出了这个核心创意——如何让Shell变量和函数“住”进一个类里。 Shell脚本本身是典型的面向过程工具,根本不提供class、对象这些原语。但作者发现,通过一些组合技巧(比如利用数组、关联数组、eval和别名),完全可以在脚本层面模拟出封装、属性和方法的调用形式,让代码组织呈现出面向对象的样貌。文章展示了这个思路的巧妙之处:不依赖语言原生支持,用看似“笨拙”的基础语法拼接出高级范式,这恰恰是黑客精神的体现——在限制中创造可能性。 对于常写Shell脚本的人来说,这或许不是一个实用工程方案,但它像一个思维实验,揭示了编程范式的本质可以超越语言表面。它提醒我们,理解底层工具后,连最朴素的脚本也能焕发出意想不到的灵活性,去拥抱更结构化的组织方式。

IT 2011-07-18 12:20:17 / 累计浏览 35,160

程序员技术练级攻略

这篇讲的是程序员如何规划技术成长路径。文章源于月光博客的一位读者反馈,他希望看到更具操作性的技术进阶指南。于是,作者结合新手朋友分享的Python与Web编程学习点滴,并融入自己作为资深开发者的经验,共同撰写了这篇攻略。 从内容上看,它并非单纯的理论罗列,而是融合了真实的学习历程。文章从Python等语言的基础入门讲起,延伸至Web编程的具体实践,最后还特别增设了“进阶”一节。这种由浅入深、兼顾新手入门与老手提升的结构,使得文章既有起点的参照,也有前进的方向。 它的特别之处在于视角的结合——既保留了初学者可能遇到的困惑与摸索过程,又提供了过来人总结的有效方法与避坑建议。对于那些处于技术成长期,想要清晰规划自己学习路线的程序员来说,这种基于真实经历的分享,比单纯的知识点罗列更具参考价值。

IT 2011-07-12 13:31:30 / 累计浏览 13,000

给程序员新手的一些建议

这篇讲的是作者参与公司实习生招聘后沉淀下的观察与思考。从筛选简历到面试沟通,作者发现不少新人对“程序员”这份职业的理解仍停留在技术本身,而忽略了更关键的部分:比如如何清晰地描述自己参与的项目,如何拆解一个陌生问题,以及面对 bug 时第一反应是查日志还是反复试错。 文章从这些实际案例出发,给出了几点切实的建议。比如,强调代码之外的沟通能力——你需要能用几句话向面试官讲清楚你项目的核心价值;比如,培养结构化的问题解决习惯,而不仅仅是堆砌技术;再比如,保持对技术的热情但避免盲目,要清楚自己技术栈的边界在哪里。作者没有讲大道理,而是用招聘中遇到的正面与反面例子,点明了从“会写代码”到“做好工程师”之间需要跨越的门槛。对于刚入行或即将步入职场的新人,这些来自招聘一线的观察,或许能帮你少走一些弯路。

IT 2011-07-06 23:49:05 / 累计浏览 5,480

软件公司的两种管理方式

这篇讲的是软件公司管理中两种截然不同风格的碰撞。作者从一位外国同事的亲身经历和强烈推荐切入,探讨了一种“宽松信任”与另一种“严密管控”的管理模式。文章并未停留在理论对比,而是深入到日常协作、代码评审、决策流程等具体场景中,分析了这两种方式如何影响开发效率、团队创新和工程师的主观能动性。 核心观点在于,管理方式的选择没有绝对对错,但其与公司文化、产品阶段及团队特质必须高度契合。作者通过实例指出,生搬硬套某种“最佳实践”往往会适得其反,比如在需要快速创新的环境中过度管控,或在关键质量节点上缺乏必要审视。 这篇文章对技术管理者和创始人极具参考价值。它促使读者思考:自己团队正在奉行的,究竟是哪种管理哲学?它是否真正匹配当前的核心目标?文中的洞察或许能帮助管理者在“放手”与“把控”之间,找到那个更适配当前土壤的微妙平衡点。

IT 2011-07-05 23:21:01 / 累计浏览 5,380

Quora使用到的技术

这篇讲的是Quora背后的技术栈分析。文章从大家熟悉的Stack Exchange和Facebook架构谈起,引出了对“知乎原型”Quora技术实现的深入探讨。 作者主要参考了Phil Whelan的剖析,核心聚焦于Quora如何构建其高并发、实时更新的知识社区。比如,文章会拆解它如何用Python和C++处理后端逻辑,如何通过Thrift进行高效通信,以及怎样利用Apache Kafka和Hadoop构建其复杂的数据管道和推荐系统。这些具体的技术选型与协作方式,构成了Quora能同时承载海量提问、回答与个性化推送的关键。 了解这些,并非为了照搬,而是看一个成功的社交问答平台如何权衡开发效率、系统性能与功能迭代。这对于正在设计类似系统或思考技术选型的团队,提供了非常具象的参考蓝图。

IT 2011-07-01 14:06:13 / 累计浏览 4,040

新浪微博的XSS攻击

这篇讲的是2011年新浪微博遭遇的一次典型XSS攻击。作者没有泛泛而谈安全概念,而是直接复盘了事件的始末。 文章描述了大量用户账号“失灵”的具体现象:他们的账号自动发布或私信发送了诸如“郭美美事件细节”、“范冰冰艳照”等极具诱惑力的虚假信息标题,并同时关注一位名叫“hellosamy”的攻击者。这种利用人性弱点的诱饵,配合社交网络的放大效应,使得攻击在短时间内广泛传播。 其核心观点在于,这次攻击清晰展示了XSS漏洞在巨型社交平台上的巨大破坏力。攻击者利用存储型XSS,在微博内容或私信中注入恶意脚本,劫持了受害者的浏览器会话,进而模拟用户操作。这不仅是一个技术漏洞,更是一次对用户信任和平台安全机制的双重打击。文章可能还分析了攻击的触发点、恶意脚本的工作原理,以及微博后续的修复措施。 对开发者而言,这个事件的启发是深刻的:它证明了即便在大型成熟系统中,前端输入过滤、输出编码以及内容安全策略(CSP)的缺失也可能导致灾难性后果。防御XSS不仅需要技术修补,更需要建立覆盖全链路的安全开发生命周期。

IT 2011-06-23 13:32:01 / 累计浏览 3,780

排序算法 Sleep Sort

排序算法是程序员入门必修课,从冒泡、快速到归并,大家可能已经习以为常。这篇讲的是一个有点“恶搞”意味的排序算法——Sleep Sort。它的核心思想非常奇特:要排序一组数字,就为每个数字启动一个线程,让该线程休眠对应的毫秒数。当休眠时间结束,线程被唤醒,按照被唤醒的先后顺序输出数字,就得到了从小到大的排序结果。 这种排序方式完全绕开了比较和交换,而是利用操作系统线程调度和定时器来“等待”结果。它的实际时间复杂度很高(O(n * max_value)),且依赖于并发环境,并不适合真实的生产场景。不过,它生动地演示了并发编程的另一面:有时候,等待也是一种处理数据的方式。 作者将Sleep Sort称为“巨NB”的算法,更多是在分享一种跳出常规思维的乐趣。它本身可能没有实用价值,但作为一种算法思想的展示,或者说一个有趣的编程谜题,它确实能让我们从不同的角度思考排序问题。

IT 2011-06-21 23:57:58 / 累计浏览 3,940

如何写出无法维护的代码

这篇讲的是编程圈里一种有趣又危险的现象——那些让人眼花缭乱的“炫技”代码为什么总是特别受欢迎。作者从酷壳网站后台数据说起,发现“6个变态的Hello World”、“如何加密源代码”这类文章长期占据热门榜,而那些扎实讲设计模式或调试技巧的内容反而没那么高流量。 文章接着拆解了这类代码的共同特征:它们往往刻意使用晦涩语法、复杂嵌套或非常规技巧,初看确实能让人觉得“这都能写出来”,但几乎无法被团队协作或后期维护。作者指出,这种追求智力优越感而忽略工程价值的倾向,其实在不少程序员的成长过程中都埋着种子。 最终文章回到一个朴素却常被忽视的原则:好的代码应该像一封清晰的信,而不仅仅是留给自己的谜题。真正的高手不是靠写出别人看不懂的代码来证明实力,而是能让代码在复杂系统中长期稳定运行。这大概是所有进阶程序员都需要反思的一课。