IT技术博客大学习 共学习 共进步

发现

共 287 篇文章

IT 2016-02-11 22:55:55 / 累计浏览 2,821

用 HTML 标记的古怪代码注释

这篇讲的是作者如何从一个令他头疼的实际问题出发,为自己“定制”了一套代码注释方法。作者坦言自己一直无法掌握传统的注释方式,尤其是当代码嵌套层次变深后,注释无法清晰标记代码块的开始和结束,导致可读性反而下降。 为了解决这个痛点,他受HTML标签清晰界定范围的特性启发,创造了一种“古怪”的注释风格:在代码块的首尾添加类似``和``的注释。他声称在PHP、JavaScript、甚至Shell脚本中都使用这种方法。这不仅能让他在快速浏览文件时立刻定位到功能模块的边界,还意外获得了一个好处:在Sublime Text编辑器中,整个代码块可以像HTML标签一样被直接折叠起来,让视图更清爽。 作者知道这做法可能不符合某些严苛的编码规范,但他认为这种“小聪明”确实提升了自己定位和理解代码的效率。这篇文章的核心在于展现一个实用主义程序员如何为了实际工作流的顺畅,打破常规、对工具进行个性化改造的思路。

IT 2016-02-11 16:24:48 / 累计浏览 2,837

研发团队的角色和构成

这篇文章从作者个人经历出发,讲述了研发团队角色与构成的演变。他对比了早年典型的分工模式与当下的新形态:过去团队里有明确的项目经理、SE(相当于产品经理)、独立的测试与QA等角色,流程偏向瀑布式。 如今,许多角色被融合或重新定义。项目经理常由团队负责人兼任,架构设计更多由资深工程师主导。一个显著趋势是“粘合剂”型工程师的出现——如SDE(软件开发工程师)需要承担从设计、编码到测试的更多职责。与此同时,纯粹的测试岗位在很多团队中正变得边缘或消失。 作者对此提出了自己的观察与争议性观点。他认为,将测试视为工程师的基本素养,比设置独立的测试岗位更有利于流程效率。他也提醒,全能型工程师虽好,但其精力若被过度分散于需求澄清或数据排查中,则可能暴露团队在产品设计或系统质量上的深层问题。 文章最终引发对工程师核心价值以及团队如何高效协作的思考。

IT 2016-02-10 22:33:09 / 累计浏览 2,731

Sublime Text 3常用快捷键

这篇整理了 Sublime Text 3 在日常编码中最为高频实用的快捷键,堪称一份“指尖提速”手册。作者将零散的命令系统化地分为选择、编辑、搜索、显示等类别,并通过“举个栗子”的方式解释了每个快捷键的具体应用场景。 文章的核心价值在于那些能显著提升效率的“大杀器”选择类快捷键,比如 Ctrl+D 连续选择相同文本、Alt+F3 一键选中所有同名单词,以及 Ctrl+Shift+L 为多行添加光标进行批量编辑。这些操作远比手动寻找替换更为高效。此外,像 Ctrl+P 结合 `@`、`#`、`:` 符号实现的文件、函数、变量快速跳转,也是 Sublime Text 高效导航的精髓。 从基础的缩进复制,到强大的多重选择与分屏浏览,文章覆盖了从入门到进阶的常用操作。掌握这些快捷键,能将重复性的键鼠操作化为流畅的键盘节奏,让代码编写过程更加专注于逻辑本身。

IT 2016-02-09 23:10:22 / 累计浏览 5,355

Sublime Text 3最好的功能、插件和设置

这篇翻译自scotch.io的文章,为开发者精选了Sublime Text 3中最值得掌握的功能、插件与配置。它没有泛泛而谈,而是直接深入到提升编码效率的具体场景中。 文章首先聚焦于几个核心的内置功能,比如通过`ctrl+shift+p`唤出的命令面板,它几乎成了所有操作的入口;又如用`ctrl+p`实现的模糊文件查找,以及`ctrl+r`的代码符号快速跳转,这些都是告别低效鼠标操作的关键。这些快捷键组合构成了高效使用Sublime的骨架。 在此基础上,文章进一步推荐了能极大扩展编辑器能力的插件生态,并分享了相关的优化设置。作者的选材体现了从基础操作到深度定制的完整路径,旨在帮助读者系统性地挖掘这款编辑器的潜力。无论你是刚接触Sublime的新手,还是想更上一层楼的用户,都能从中找到切实可行的优化点。

IT 2016-02-07 14:43:31 / 累计浏览 2,092

为什么我要垂直对齐代码(你也要如此!)

这篇讲的是 HackerNews 上关于 Linux Kernel 代码风格的讨论中,一位开发者为“垂直对齐”代码风格的坚定辩护。作者从一个简单例子切入:未对齐的变量声明与对齐后的版本,后者能让 `bob_age = 250` 这样的异常值一眼就能被捕捉到。 文章的核心论点是,编程工作中有大量时间花费在理解现有代码上,而垂直对齐这种看似微小的格式调整,能显著降低这种“理解成本”。作者类比了代码与散文的阅读区别,强调清晰的代码就像一篇好文章,需要借助命名、间隔等“视觉线索”来提升可读性,让接手代码的人能更快理解意图,而非陷入解密格式的泥潭。 文中还延伸讨论了等宽字体与比例字体的争论,但最终落脚点仍是可读性——任何有助于快速理解代码结构的工具(无论是字体还是对齐)都值得采用。作者用略带调侃的“圣战”口吻,实质上是在呼吁开发者们更多地关注代码的“用户体验”,而不仅是功能实现。

IT 2015-12-13 21:39:57 / 累计浏览 6,313

让我们来谈谈分工

这篇谈的是分工在技术和组织中的利弊与选择。作者从雅虎取消QA团队的新闻出发,引出一个根本问题:我们习以为常的“专职分工”,究竟是效率之源还是视野之锁? 文章回溯了亚当·斯密在《国富论》中对分工的赞许——它通过提升熟练度、减少转换损耗、催化工具创新,极大地解放了生产力,福特的流水线就是经典例证。但分工也有代价:它可能将人固化为“不思考的机器”,滋生厌倦,并带来高昂的沟通协同成本。 更深刻的剖析来自全球化视角。分工的逻辑在商业中常滑向“比较优势”,即选择成本最低者而非最合适者。这解释了外包浪潮的迁移路径,也警示了单一技能岗位的脆弱性——你的工作可能因更廉价的劳动力而消失,与你是否“全栈”无关。 最终,作者将讨论引向技术管理层面,指出理想的分工应从“基于技能的控制型”转向“基于责任心的承诺型”。技术本身既是分工的天敌(自动化可替代重复劳动),也是解决分工难题的关键。文章最后留给读者关于个人职业选择的思考:是甘为体系中一枚精密的螺丝钉,还是努力成为能应对复杂挑战的多面手?

IT 2015-11-08 22:18:39 / 累计浏览 3,677

更改 Windows 10 命令行字体

这篇讲的是中文版 Windows 10 命令行一个让人头疼的细节:默认的“新宋体”字体,会把数字 1 和小写字母 l 显示得几乎一模一样,对于经常使用命令行的开发者来说,这简直是辨认灾难。 文章直接给出了两个具体的解决办法。最简单的是在命令行输入 `chcp 437`,将代码页从中文的 936 切换到英文的 437,之后就能在属性里选择像“Consolas”这样区分度更高的字体。不过作者也指出了后续问题——切换后中文会显示不全,因此需要再通过 `chcp 936` 切换回来。 如果希望尝试更多字体,文章还进阶介绍了注册表方法:在指定的注册表路径下新增字体键值,从而让系统命令行支持自选的等宽字体。作者最后小小吐槽了一下微软不直接提供字体选择功能,倒是说出了不少人的心声。

IT 2015-11-08 22:11:09 / 累计浏览 1,977

从构建和测试的效率说起

这篇文章从作者在EMR上执行Spark job的真实工作流出发,探讨了软件开发中一个常被忽视却极其重要的话题:构建与测试的效率优化。作者反思了自己初期因跳过本地测试阶段,直接在耗时较长的Workflow上集成测试而导致效率低下的经历,提炼出一个关键教训:测试应当分层,在成本最低的阶段尽早覆盖尽可能多的验证项,跳过大步骤往往事倍功半。 文章进一步将这种“等待的痛苦”延伸到更复杂的场景,例如将新package合并进现有版本集(version set)时,可能遭遇的依赖冲突、环境差异和调试难题,揭示了工业化软件开发中维护成本高昂的现实。 最后,作者对比了两种常见的代码分支管理策略(单分支模式与双分支模式),基于效率考量表达了对单分支模式的倾向,并点出许多团队在实践中也会不自觉地回归至此。作者以一幅经典的“程序员为何看起来很闲”的漫画作为比喻,指出频繁的上下文切换与长时间的编译等待是一种无奈的“低效勤奋”,呼吁团队将构建效率的提升置于更重要的位置——这或许比某些纯技术问题更能切实解放生产力。

IT 2015-11-08 22:07:36 / 累计浏览 3,232

git术语解释staging,index,cache

这篇讲的是Git里三个让人头疼的术语:staging、index和cache。作者从自己的困惑出发——为什么《Pro Git》里叫staging area,`git-reset`的文档里叫index,而`git-rm`的参数却是`-cached`?这三个词到底是不是一回事? 文章追溯了问题的根源,发现这其实是Linus Torvalds当年的“一念之差”。在开发Git初期,为了管理Linux内核的补丁,他设计了一个“目录缓存”来保存完整的目录树快照。这个缓存的内容结构,在源码里被存储在一个叫`index`的文件中。因此,在Git的底层实现(源码)里,操作这个缓冲区的变量都带着“cache”前缀;而“index”这个名字则因为它作为文件直观地出现在了`.git`目录里。 随着时间推移,普通用户更多通过文档而非源码接触Git,“index”成为了更通用的称呼。而“cache”一词则逐渐退居幕后,仅在讨论内部实现时使用,其过去分词“cached”则作为一个形容词保留下来,用于描述“已通过`git add`放入暂存区”的状态。通过引用git核心维护者Junio C Hamano的解释,文章理清了这三个术语的历史脉络和细微差别,帮你理解为什么同一个东西会有这么多名字。

IT 2015-11-02 23:00:11 / 累计浏览 3,471

SVN为什么比git更好

这篇文章的作者个人偏爱Git,但他从团队实际出发,提出了一个反向思考:在什么情况下,SVN可能是比Git更“好”的选择? 作者以一家拥有约20名程序员、使用多种语言的创业公司为背景,坦率地分析了SVN的优势。它拥有广泛的群众基础,几乎所有人都能快速上手;跨平台支持优异,尤其以Windows下的TortoiseSVN著称;核心优点是简单易用,甚至能被误用作“云端文件夹”也未引发大问题;经过十五年打磨,其功能完善且流程稳定,非常适合传统的公司制研发团队管理。 相对地,作者指出Git的主要短板在于高昂的学习成本(尤其对新人和非核心技术人员),对Windows平台支持不佳,其分布式概念和存储原理构成了一定的抽象门槛,并且过高的自由度容易因误操作给团队带来混乱。 结论是,对于研发规模中等偏上、人员背景多样的创业公司而言,如果团队协作并不涉及高频次的跨地域开源协作,SVN在降低团队协作摩擦和上手成本方面,可能是一个更务实、更稳妥的选择。

IT 2015-11-02 22:26:19 / 累计浏览 3,076

git 查看文件修改记录

这篇讲的是,当接手了几年前的历史代码,想追查某行逻辑的修改记录时,`git log` 可能不够用。作者分享了自己从 `git log -p` 到熟练使用 `git blame`,最终定位到“问题代码”最初引入版本的全过程。 文章指出,单纯用 `git log` 只能看提交摘要。加上 `-p` 参数才能看到具体修改内容,但这对于长期演进的文件依然不够精准。真正的利器是 `git blame`,它能标注每一行最后的提交。通过 `-L n,m` 参数,可以只查看特定行范围的修改历史。 更关键的是,文章演示了一套“链式追溯”技巧:用 `git blame` 找到某行的最近一次修改提交,再进入该提交查看对应行号,然后以此提交号和行号为新起点,再次执行 `git blame`,如此循环往复,便能沿着代码的修改路径,一路回溯到最初被引入的那个提交。作者建议配合 Source Tree 等图形化工具查看具体的代码 Diff,让这个追溯过程更直观。

IT 2015-07-23 14:05:06 / 累计浏览 1,486

细说云计算之外的雾计算与流计算

这篇文章探讨了数据中心领域里,除了广为人知的云计算之外,另外两种重要的计算范式:流计算和雾计算。 作者首先指出,许多“云数据中心”名不副实,云计算在落地过程中面临诸多挑战,催生了对多样化计算模式的需求。文章的核心在于对比这三者的特点与适用场景。云计算被定义为一种集中式的计算模式,它通过将大量普通计算机联网,用软件调度形成强大的并行计算能力,从而摆脱了对单一高性能巨型机的依赖。 相比之下,流计算(由IBM提出)则专注于处理来自各种源头的实时数据流。它跳过了传统“先存储后查询”的模式,直接对流经系统的数据进行即时过滤、分析与关联,非常适合需要对市场警报或事件做出快速反应的业务场景。 而雾计算(由思科提出)则显得更为“接地气”。它并非追求云端的强大算力,而是将计算、存储和网络功能分散到更靠近用户的网络边缘,由大量性能较弱但分布广泛的设备共同完成。这种分布式架构,使得中小型数据中心能够轻松部署,也更符合互联网去中心化的趋势。 简而言之,这篇文章清晰地勾勒出:云计算强在集中算力,流计算强在实时数据处理,雾计算强在边缘与分布式部署。它们并非互相替代,而是为不同需求的数据中心建设提供了多元化的技术路径。

IT 2015-07-23 13:52:57 / 累计浏览 1,424

为什么 IE 不支持(子)域名含有下划线

作者分享了一个让他“永远不会忘记”的调试经历:为什么在IE浏览器中,一旦(子)域名包含下划线,PHP的会话cookie就会完全失效,即使最新的IE11也不例外。 问题的根源追溯到一个2001年的安全补丁(MS01-055)。微软为修补早期漏洞,实施了非常严格的DNS名称校验,要求必须遵循早期的RFC标准(如RFC606/608)。而早期标准并未包含下划线这个字符,因此IE会拒绝设置任何域名部分含有下划线的Cookie。作者指出,微软在此可能混淆了“主机名”与更广义的“域名”概念,因为RFC2181已表明DNS协议本身对标签字符没有限制,但微软的严格校验成为了IE独有的“遗留问题”。 由于这是浏览器端的强制策略,对于开发者而言,唯一的解决方案就是在域名命名中主动避免使用下划线。作者最后抛出了一个观点:在坚持看似“正确”的标准与适应已经普遍接受的实践之间,浏览器厂商该如何选择?

IT 2015-07-23 13:40:38 / 累计浏览 2,092

拒绝修复 bug 的几个正当理由

这篇讲的是:在软件开发中,一味地、立即修复所有 bug 可能并非最佳实践。 作者从代码质量与项目长期健康度的视角出发,提出了四个可以“正当”拒绝 bug 修复的理由。首先,草率的修复常通过删除或跳过单元测试来让构建通过,这实质上降低了测试覆盖率,为系统埋下隐患。其次,一个合格的修复应包含能重现该 bug 的测试用例,否则只是掩盖问题,无法防止修复行为本身引入更多“熵”。再者,bug 修复应保持小而专注,避免与代码重构混杂在一起,否则会使补丁难以审查和理解。最后,一次 pull request 应只处理一个 bug,确保修改的纯粹性和可追溯性。 作者的核心观点是,bug 修复的纪律比程序员良好的重构意图更重要。有时,要求提交者完善测试、拆分补丁,是比简单合入代码更负责任的选择。文章通过具体的技术场景,为团队代码评审和维护流程提供了一套清晰的思考框架。

IT 2015-06-04 10:23:39 / 累计浏览 1,728

在白板上写代码是有难度的

这篇讲的是技术面试中那个让不少人头疼的环节:白板编程。作者从自己作为微软团队面试官的经验出发,给出了一个核心观点——面试官真正在考察的,并不是你能否当场写出语法完美无误的代码。 他理解白板没有智能感知和语法高亮,因此不介意你出现参数顺序错误这类“小瑕疵”。真正看重的是你的问题解决过程:是急于动手,还是先理清思路?是否主动识别并澄清了需求中的模糊点?会优先攻克难点还是先处理简单的部分? 文章以几个经典面试题(如实现栈、打乱数组)为例,点明了关键:很多问题本身就暗藏陷阱,比如字符串处理需要考虑不同编码,数组随机化要区分安全场景与测试场景。忽略这些“真实世界”的考量,代码设计就无从谈起。 作者鼓励应聘者,在编写代码时就要像开发者一样思考:如何测试?如何处理异常输入?代码是否健壮、可维护?他认为,展现出这种工程思维,远比纠结于一时的语法记忆更能证明你的潜力。最后他也坦言,技术面试本就艰难,聪明如他也曾被拒,这本身就是一个值得准备的过程。

IT 2015-06-04 09:51:32 / 累计浏览 8,912

Zend Studio集成Git使用

这篇文章提供了一份在Zend Studio中集成和使用Git的详细操作指南。对于许多初次接触Git的开发者来说,其“本地库”与“远程库”分离的工作流以及分支概念往往令人困惑。文章正是从解决这个实际痛点出发,用清晰的步骤拆解了整个过程。 作者首先演示了如何在服务器端建立裸仓库,随后重点落在IDE中的具体操作:从初始化本地Git仓库、提交代码,到配置远程仓库并完成推送与拉取。文章特别指出了一个新手常踩的“坑”:当执行“Pull from Upstream”后,工具并不会自动合并远程更新,需要开发者手动执行“Merge”操作,这个细节描述得很到位。 在分支管理部分,文章不仅介绍了创建、切换和合并分支的命令与IDE操作,还贴心地提醒了切换分支时文件会暂时“消失”的正常现象,避免开发者惊慌。整体而言,这是一份从服务器配置到日常开发(如同步代码、管理分支)的全流程实用指南,适合那些希望在熟悉的IDE环境中快速上手Git的开发者。

IT 2015-06-02 13:37:35 / 累计浏览 1,813

思考哪里可以推到重来

这篇讲的是,作者从一次规划伦敦旅行时遇到的打车痛点出发,引出了一个有趣的思考角度。当想到用Uber来解决传统出租车服务的低效环节时,他意识到这种“推倒重来”的思考方式本身就值得被提炼。 文章的核心并不是介绍Uber这个产品,而是借其成功重塑打车行业的案例,分享了一套极具操作性的“重新思考”心法。作者总结了六个关键问题,引导我们从识别不满开始,层层深入地剖析现有流程的症结:哪里效率低下?如果优化会怎样?整个流程为何如此设计?假设完全打破障碍何在?以及最终,一个理想的重构方案应该是什么样。 这更像是一篇关于思维训练的观点分享。它鼓励我们不满足于现状,主动去发现生活中那些“不太对劲”的环节,并尝试用系统化的方式去构想更好的解决方案。对于技术人或产品思考者而言,这套从具体痛点到抽象重构的思考步骤,提供了一个非常实用的创新思维脚手架。

IT 2015-04-26 22:50:14 / 累计浏览 3,663

GDB 进行程序调试笔记

这篇笔记详细记录了从零开始使用 GDB 调试 C 程序的全过程。作者以一段包含循环累加的简单 C 代码为例,清晰地展示了调试前的必要准备——必须使用 `gcc -g` 参数编译,将源码信息嵌入二进制文件,这是所有调试操作的基础。 进入 GDB 后,文章没有罗列枯燥的命令列表,而是通过实操讲解了最核心的流程:用 `start` 启动程序,用 `list` 查看源码;在函数调用处,区分了 `next`(单步执行不进入函数)与 `step`(进入函数内部)的不同用途。当进入 `add_range` 函数后,通过 `backtrace` 查看函数调用栈帧,用 `info locals` 和 `print` 命令观察局部变量的状态,甚至演示了如何用 `set var` 在运行时修改变量值。最后,以一个命令表格收尾,汇总了 `bt`、`finish`、`frame` 等高频命令的用途。 它本质上是一份面向初学者的 GDB 速查手册,重点突出了调试过程中“查看”与“干预”程序状态的两大核心能力,对于不熟悉命令行调试的开发者来说,是非常实用的入门参考。

IT 2015-04-26 22:21:51 / 累计浏览 3,330

一个实例:为什么注释是愚蠢的

这篇文章讲的是代码注释在软件开发中的争议与价值。作者从自己早年认为“写注释是好习惯”出发,经过研读《代码大全》与《代码整洁之道》,观点发生了根本转变:冗余或解释性的注释往往掩盖了代码本身命名不佳、结构混乱的问题。 为了证明这一点,作者没有虚构例子,而是选取了微软开源的 .NET 框架中一个真实的路径分割方法进行重构演示。他一步步展示了如何通过将参数名 `path` 重命名为 `validatedFullPath` 来消除“假设路径已验证”的注释,以及如何通过提取方法、引入类结构等方式,将原本需要多条注释来解释的逻辑,转化为自解释的代码结构。 文章的核心论点是,真正优秀的代码应当像清晰的散文一样“会沟通”,程序员的精力应该投入到打磨可读性高的命名和结构上,而不是用注释来弥补代码的缺陷。它并非全盘否定注释,而是倡导一种更根本的编码哲学:追求代码本身的清晰,应是专业开发者的目标。

IT 2015-02-26 22:26:26 / 累计浏览 4,452

软件开发的硬约束

这篇讲的是作者从超市结账小票的两种打印方式出发,对软件开发中“软约束”与“硬约束”的深刻反思。 作者观察到,收银小票倾向于为同一件商品打印多行记录(每行数量为1),而非合并成单行(数量为N),即使后者更省纸。起初他怀疑是设备性能所限,但通过一次收货管理系统的开发与实地部署,他发现了真正的原因:合并记录会影响仓库作业流程的效率与操作习惯——后续员工需要在纸质清单上手动划销,单件单行才最直观。 这个发现让他意识到,长期从事纯软件开发时,功能、架构与责任划分往往具有灵活性(“软约束”),可以按需调整。但现实世界存在大量“硬约束”,比如设备操作习惯、生产线工艺流程、物理环境限制等。他进一步以工厂生产多语言说明书为例:生产线难以像软件模块一样灵活拆分组合,导致不得不为所有市场印刷包含所有语言的通用说明书,以避免为每种语言维护独立生产线的高昂成本。 作者总结道,随着软件深入物理世界,决定其价值的往往不是复杂的技术架构,而是能否与现实约束融洽相处。开发者需要跳出纯粹的代码思维,直面问题的核心限制。文章最后以快递站利用条码替代键盘操作的巧妙案例收尾,说明了解决方案可以完全跳出技术框架,以极低成本满足场景的真实需求。