在敏捷
这篇文章分享了让Scrum实践更“舒服”的核心心得。作者从沟通、预估、团队和目标四个关键维度展开,强调Scrum并非固定模式,而是需要通过持续磨合来找到最适合团队的节奏。 文中指出,顺畅的沟通(尤其是面对面沟通)是这一切的基础,有时甚至需要非正式场合来建立信任。在预估方面,文章用图示说明了初期难以精准的现实,建议将任务拆解细化,为测试预留时间,通过迭代逐步提升预估准确性。 团队协作部分着重于建立“我们是一个整体”的文化——共享需求、共担责任(包括修复Bug)、互相支持,确保个人休假不会阻碍进度。最终,所有努力都指向一个共同的目标:明确每个冲刺的任务,做出并完成承诺,共同庆祝成功或复盘失败。 文章结尾推荐了《Scrum敏捷软件开发》一书,供读者在需要时深入研究。整体来看,它为团队落地Scrum提供了务实且充满人情味的视角。
Django数据库访问优化
这篇文章从Django开发者的实际痛点出发,聚焦于如何诊断并解决数据库访问性能瓶颈。作者首先指出了两个实用的分析工具:利用 `django.db.connection` 查看执行的SQL与耗时,以及集成 `django_debug_toolbar` 进行可视化监控。 在优化策略上,文章的核心思路是将计算尽可能下推到数据库层完成。它详细讲解了如何善用 `filter`、`exclude` 以及 `F()` 对象进行高效过滤,并通过 `annotate` 预先完成聚合计算。对于复杂查询,则介绍了 `QuerySet.extra()` 和原生SQL的使用场景。 针对ORM层常见的性能陷阱,文章深入剖析了QuerySet的惰性求值与缓存机制。它对比了 `select_related`(针对外键/一对一关系)与 `prefetch_related`(针对多对多关系)这两种预加载技术的不同适用场景,能有效避免N+1查询问题。此外,通过 `values()`、`defer()` 和 `only()` 精确控制返回字段,以及使用 `count()` 代替 `len()`,都能显著减少不必要的数据传输与处理开销。这些技巧共同构成了一套从诊断到优化的完整实践指南。
程序员不是包身工
这篇文章从一篇质疑员工发展业余项目的文章切入,明确反对将程序员视为纯粹“劳动力”的落后管理思想。作者认为,优秀的老板应当感激员工为共同愿景所付出的时间与才华,并积极鼓励他们在业余时间进行创造。 作者详细列举了允许乃至鼓励业余项目带来的多重好处:员工可以试验新技术、获得独立决策的创造空间、深化专业技能、有效消解工作疲劳,甚至通过专注与社交为公司间接带来新知识与人才。文章反驳了“做业余项目就会辞职创业”的简单逻辑,指出资金、动机和生活稳定性等多重现实因素,说明多数人会在贡献本职工作与追求个人兴趣间找到平衡。 在当前技术人才竞争激烈的环境下,文章强调,吸引顶尖程序员的关键已远不止薪水,更在于是否尊重他们的个人成长与自由。对老板而言,信任并支持员工的业余探索,其带来的隐形价值——如团队活力、技术敏锐度与创新文化——远大于有限的所谓“损失”。
移动开发之touch event篇
这篇讲的是移动端网页开发中,如何用好触控事件来优化交互体验。作者从移动设备流量已占北美网络总流量20%的背景出发,指出虽然手机浏览器能渲染桌面网页,但交互方式因缺少鼠标而大不相同。 文章核心梳理了三个基础触摸事件:`touchstart`、`touchmove`和`touchend`,并通过控制台日志演示了事件触发的顺序与包含的触摸点列表(`touches`, `targetTouches`, `changedTouches`)的区别。作者还深入探讨了几个实际开发中的关键点:如何一行代码检测浏览器触摸支持;在`touchend`中,离屏的触摸点仅存在于`changedTouches`列表;以及移动端“轻拍”如何被浏览器转化为单击事件。 特别值得一提的是,文章分析了在`touchmove`事件中使用`preventDefault()`来禁用页面默认滚动和缩放的最佳实践——这是实现诸如Canvas自由绘图等自定义手势的基础。作者通过几个可运行的Demo和截图,将抽象的事件模型变得直观可感,对需要处理多点触摸或自定义手势的前端开发者来说,是份清晰的入门与避坑指南。
提高代码可读性的注释技巧
这篇讲的是如何通过注释让代码更“友好”。作者从最实用的技巧出发,强调注释应与代码结构同步:比如为类和方法添加标准化摘要,或在每个独立功能块前用分段注释说明意图。文章特别指出了几个容易踩的坑:要避免写“if (a==5) // 判断a是否等于5”这类冗余的“傻瓜注释”,更要杜绝在注释里抱怨前同事或用户——毕竟你不知道将来谁会读到这些字句。 更进阶的建议包括:使用像“TODO”这样的团队通用标签来高效沟通,最好在写代码的同时就完成注释,这时思路最清晰。最终目的是让注释成为未来的你和其他开发者之间的清晰桥梁,而不是单纯应付任务的填充物。整篇文章给出了从态度到具体操作的完整清单,让注释真正服务于代码的可读性。
Git常用命令备忘
这篇讲的是Git的常用命令速查手册。作者把日常开发中最可能用到的Git操作,从基础配置到进阶使用,系统性地整理成了一份清晰的备忘录。 内容从配置用户信息和设置别名开始,快速上手。接着是文件操作的三板斧:用`git add`暂存修改,用`git commit`提交,以及用`git diff`查看差异,文中详细列举了各种diff比较场景。分支管理部分尤为实用,涵盖了创建、切换、合并分支,以及使用`git rebase`整理提交历史的命令。 文章还覆盖了几个非常实用的功能:通过生成和应用补丁在不同环境间同步修改;利用`git stash`临时保存工作进度,专注于紧急任务;以及远程协作的核心命令`git pull`和`git push`,包括如何跟踪远程分支和清理远程仓库。 这份清单的细致程度很高,甚至包含了如何使用`tig`这样的可视化工具,以及设置远程仓库HEAD指向等细节。对于不常使用Git,需要偶尔回顾命令的开发者来说,这份结构化的清单可以作为手边的速查手册,省去反复搜索文档的麻烦。
GA SEO报告中的Not Provided和Not Set
用GA追踪SEO时,看到自然搜索流量里冒出来的“(not provided)”和“(not set)”总是让人一头雾水。这篇文章就专治这种困惑,作者从GA报告的具体路径入手,一步步拆解了它们的来龙去脉。 核心问题在于,(not provided)并非GA的故障,而是Google为保护已登录用户的隐私而采取的加密措施。当用户通过加密的HTTPS链接访问网站时,搜索关键词信息就被隐藏了,GA自然也就“无从得知”。这也解释了为什么付费广告数据通常不受影响——Google对广告主还是“网开一面”。而(not set)则更像是一个占位符,用于表示那些本身就没有关键词维度的流量来源,比如直接访问。 文章还指出了一个现实:随着浏览器安全策略的收紧,(not provided)的比例可能远超预期。既然精确获取关键词已无可能,作者建议利用GA的“二级维度”功能,通过分析对应的着陆页来间接推断用户意图。这篇分析把GA报告里一个看似技术性的小问题,讲透了背后的逻辑和应对思路。
scala入门手记
作者从环境安装与配置讲起,记录了如何为Scala搭建开发环境,包括JDK准备、Scala下载以及在Eclipse中安装插件。通过一个经典的“hello world”示例,展示了Scala程序的基本结构,并指出其与Java项目的相似之处。 文章的核心价值在于一份简洁的语法对比速记。作者将Scala与Java的关键差异点清晰列出:例如Scala的数组是可变结构而List是不可变的、`var`与`val`分别对应可变与不可变变量(并提倡多用`val`)、`object`关键字实现了单例模式,以及`::`和`:::`这两种用于列表操作的不同操作符。这些对比点能帮助有Java背景的开发者快速抓住Scala的语言特性。 对于想了解Scala基础或考虑技术迁移的开发者来说,这篇手记提供了一个从安装到基础语法的平滑入门路径,侧重于实操和与熟悉语言的对照,非常实用。
Python高效编程技巧
这篇讲的是Python编程中那些容易被忽略但极其实用的技巧。作者从多年使用Django、Flask等流行框架的经验出发,分享了五个能提升代码整洁度和效率的知识点。 比如,除了常见的列表推导,文章详细展示了如何用同样的语法优雅地创建字典和集合。还介绍了`collections.Counter`这个内置利器,它能一行代码搞定字符频次统计。对于处理JSON,作者提醒可以用`json.dumps`的`indent`参数让输出结构化,便于调试。 此外,文章演示了如何用标准库快速搭建一个临时的XML-RPC服务,用于内部程序间的简单交互。最后,作者强调了Python强大的开源生态,并指出了评估一个优秀第三方库的几个关键标准:清晰的许可、活跃的维护、便捷的安装以及充足的测试。 这些技巧大多源自Python标准库,无需额外安装就能让日常编码变得更高效、更易读。
字符编码和中文乱码小叙
这篇讲的是字符编码从ASCII到UTF-8的演进历程,以及由此引发的中文乱码问题。作者从早期计算机只支持英文的ASCII编码说起,谈到欧洲语言扩展出的ISO8859-1,再到为解决中文等复杂文字而诞生的GB2312、GBK等国标编码,最后引出了致力于一统天下的Unicode及其存储实现UTF-8。 文章重点对比了在中文环境下最常见的两种编码:GBK和UTF-8。它指出了一个典型的“乱码陷阱”:Windows系统常用兼容GB2312的ANSI编码,而Linux等系统则普遍采用UTF-8。这种不一致,正是跨平台处理中文文件时频繁出现乱码的根源。 对于开发者,文章强调在编写Web程序时必须确保数据库、程序文件、网页声明(如``)以及数据库连接(如对MySQL执行`set names`)的编码统一。虽然文中以GBK为例说明了如何配置,但最终的建议是拥抱UTF-8——因为它已成为国际标准,与主流Linux服务器生态契合度更高,是更面向未来的稳妥选择。
HBase Thrift 接口使用注意事项
这篇讲的是作者在实际使用HBase Thrift接口(基于0.92.1版本)时,总结出的几个关键陷阱和注意事项,对开发者在实际对接时避坑非常实用。 文章首先强调了字节存储顺序的重要性。由于HBase内部按字典序排序,row key和value中的数值类型在转换成byte数组时,必须严格使用大端序进行打包和解包,否则会导致数据无法正确检索。作者给出了C++和PHP中的具体处理示例。 接着,文章指出了一个在PHP和C++接口中行为差异显著的“TScan设置陷阱”。在PHP中,直接设置属性即可生效;但在C++中,必须通过专用的`__set_xxx()`方法赋值,才能将内部的`__isset`标记置为true,否则服务端会忽略这些设置,导致扫描从头开始。 最后,文章从运维角度提出了两点建议:一是合理配置Thrift Server的并发线程数(通过`-threadpool`参数),避免请求被阻塞;二是当进行带缓存的扫描操作时,需要调大Thrift Server的最大堆内存(`HBASE_HEAPSIZE`),以防止因缓存数据过多而引发内存溢出错误。 这些问题都是实际开发部署中容易忽略的细节,但对系统性能和功能正确性有着直接影响。
sshd+chrome+switchsharp翻墙
这篇讲的是如何在Linux系统下,通过SSH隧道结合Chrome浏览器的SwitchySharp插件,为团队成员快速搭建一条稳定的访问通道。作者从团队获得了一个付费SSH翻墙账号的背景出发,解决了此前免费账号质量不稳定、无法流畅访问Google、Twitter等网站的问题。 文章的核心方案分为三步。首先,利用`putty-tools`中的`plink`命令建立本地SOCKS代理,关键参数是`-D 127.0.0.1:7070`,并将其封装为可执行脚本`fan.sh`以便一键启动。其次,为Chrome浏览器安装代理切换插件`proxy-switchysharp`。最后,详细配置插件,设置代理类型为SOCKS5,并配置自动切换规则,例如通过正则`(google|facebook|twitter|youtube){1}`来区分哪些网址需要走代理。 完成上述配置后,只需运行脚本并启用SwitchySharp的“自动切换模式”,即可实现对目标站点的代理访问。整个过程清晰、可操作性强,为需要特定网络环境的开发者提供了一个轻量且有效的解决方案。
HBase集群出现NotServingRegionException问题的排查及解决方法
这篇讲的是HBase集群在压力测试中频繁出现NotServingRegionException,导致读写波动乃至短暂不可用的实战排查经历。作者从实际压力测试中遇到的问题出发,发现当每秒读写量达到几十万条时,客户端会周期性地抛出大量异常。 经过对Master日志的分析,问题的根因被定位到两个关联过程:一是由于rowkey包含时间戳且写入量巨大,导致频繁的Region Split(平均耗时约10秒);二是Split后Region分布不均,进一步触发了自动的Region Balance(平均耗时约20秒)。这两者都会造成Region暂时下线。 为解决这一问题,文章从客户端和服务端两个层面提出了具体方案。客户端侧,可通过设置自动刷写(autoFlush)保留写入缓冲区,或调整重试次数与间隔来增强容错。服务端侧则更为关键,建议关闭自动Balance并选择低峰期手动执行;同时针对Region无限增长的问题,提出了两种根治思路——按天分表或巧妙地将时间戳字段改造为周期循环值,从而实现Region的复用。整个过程提供了清晰的排查逻辑与可落地的解决方案。
可用性测试好助手——Morae软件的应用
这篇讲的是如何用Morae软件提升可用性测试的效率与规范性。作者从实际项目痛点出发:研究员现场记录耗时、反复回看视频定位问题、甚至录音设备故障,而需求方又难以直观参与观察过程。针对这些问题,文章详细拆解了Morae这款由TechSmith开发的工具。 Morae分为Recorder、Observer和Manager三个组件。Recorder安装在用户端,负责录制操作过程并支持设置自动化任务流程与满意度问卷;Observer让需求方能远程实时查看操作并打标记;Manager则在后期用于分析数据、生成图表报告。作者通过一个虚拟项目案例,逐步演示了测试前如何配置Recorder的研究框架、设置视频来源(如画中画拍摄用户表情),以及测试中如何利用Observer进行同步观察与关键事件标记。 文章特别展示了Marker和Survey功能的设计,能帮助团队高效捕捉问题点并收集用户主观反馈,最终将录屏、标记与问卷数据整合,快速产出结构化的可用性测试报告。对于想减少人工操作干扰、让测试流程更专业的技术团队,这是一套切实可行的落地方案。
移动端App测试实用指南
这篇指南从一个测试人员的独特视角出发,提出了一份详尽的移动端App测试“问题清单”。文章没有停留在理论,而是将测试过程解构为一系列可操作的思考:测试应该从哪里收集信息(即使是有限的资料)?如何创造性地扮演不同用户角色(从新手到黑客)来探索应用的边界?又如何深入数据层面,验证同步、存储和异常状态下的表现? 它更通过Facebook、RunKeeper等真实案例,展示了如何从用户评论、微小的拼写错误和看似荒诞的操作(如将体重单位设为公元1年)中,发现深层的逻辑与体验问题。作者强调,发现问题没有捷径,核心在于持续地、有策略地追问“如果...会怎样”。这份清单与其说是测试步骤,不如说是一份思维检查手册,它提醒团队:移动端的复杂性和用户行为的不可预测性,往往就藏在这些细节的拷问之中。
Git commit 注释格式
这篇技术文章从一个常见但容易被忽视的细节入手:Git commit的注释格式。作者指出,虽然Git没有硬性规定,但良好的注释习惯对团队协作和项目历史维护至关重要。 文章以Linux内核、PHP等知名开源项目的实践为例,总结了一套推荐的注释规范。核心是“50/72”规则:首行总结不超过50字符且不使用句号,空行后接不超过72字符宽度的详细说明。这种结构既让`git log`输出更清晰,也方便用于邮件通知的标题与正文分离。 除了格式,文章还着重指出了应当避免的“坏味道”提交,比如将版本控制工具当作临时备份、把不相关的修改混在一次提交里,或是用“修正错误”这样含糊的描述。同时,它也提供了一些实用技巧,例如使用`module:`前缀组织大项目提交,以及用`git diff --check`预检空白字符错误。 这篇文章没有空谈理论,而是直接给出了可操作的标准和反面案例,帮助开发者快速建立专业的提交习惯。
移动Web开发初学者指南
这篇指南从一个常见误解切入:很多开发者觉得移动Web体验远不如桌面Web,但作者指出,只要正确看待移动Web的独特环境而非把它当作桌面的“蹩脚扩展”,其体验其实非常棒。移动Web开发正当时,技术门槛也因WAP 2.0和XHTML-MP的普及而大幅降低。 文章的核心是对比了三种移动Web开发策略。最简单的是直接移除桌面网站的图片和样式,快速但体验粗糙且浪费流量。更进阶的是使用手持型样式表,它灵活且能利用现有CSS知识,但面临设备支持不足和对内容语境关注不够的问题。作者着重推荐的第三种方法是构建面向移动设备的网站,即专门为移动用户的特定语境(如单手操作、碎片化时间、位置相关)去设计内容和功能。这需要更多投入,但能提供更优的体验。例如旅行网站Kayak的移动版就极大地简化了搜索流程,甚至提供了便于直接拨打电话的号码,这完美契合了移动场景下的用户需求。 作者通过清晰的对比和具体案例,为初学者厘清了移动开发的核心思路——不是缩小桌面网页,而是围绕移动语境去“移动化”,并为迈出第一步指明了务实的方向。
移动终端开发必备知识
这篇讲的是随着移动设备激增,如何高效开发调试WebAPP。文章从厘清基础概念入手,解释了CSS像素与设备像素的区别,以及PPI/DPI如何决定屏幕的默认缩放比例,这对于理解页面在不同手机上的显示差异至关重要。 核心内容对比了三种应对安卓设备碎片化的开发方案:“简单粗暴”方案虽省事但会导致高密度屏幕失真;“极致完美”方案通过device-dpi和媒体查询实现精准适配,但需为每种分辨率编写代码;作者推荐的“合理折中”方案则针对安卓市场主流(高密度设备)进行设计,用一套代码实现大部分设备的最优显示,在效果与成本间取得了平衡。 文章还分享了实战调试技巧,重点介绍了weinre工具的使用步骤,让开发者能在电脑上远程调试手机页面,并提及了AVD模拟器、手机抓包与配host等实用方法,覆盖了从布局认知到问题排查的全流程。
如何避免重构带来的危险
代码重构是提升软件质量的常见手段,但盲目重构往往带来更大风险,甚至导致系统崩溃。这篇文章的核心观点是:除非必要,否则不要轻易对代码进行大刀阔斧的改动。作者明确划定了“红线”——如果你不理解代码的历史背景、逻辑过于复杂、项目时间紧迫或你是团队新人,那么重构的条件并不成熟。 相反,在分析清楚代码臃肿原因、确保有充足时间与测试资源、且修改后逻辑将显著更清晰时,重构才是合理的。文章特别强调,所有重大修改都必须与团队共同决策。 如何安全落地重构?作者给出了几条关键建议:首要任务是建立自动化回归测试,以此作为快速验证修改的“安全网”;其次,应采用短周期的开发与发布模式,并将重构代码尽可能隔离,便于问题定位。同时,一份涵盖回归、功能、性能等多维度的测试计划必不可少。 文章还提倡“小粒度重构”,即在修改现有代码时顺手优化其局部,保持代码整洁,但务必与同事讨论。最终,作者提醒我们:忍住重构不理解代码的冲动,不断学习新技术,但更应审慎思考其适用场景,避免为了用而用。
当我加入项目时,我要了解什么
这篇文章讲述了一位经验丰富的技术人员在频繁加入新项目时,如何快速把握全局并投入工作的核心方法。作者认为,理解项目应从三个层面循序渐进:首先是业务,目标不是纠缠细节,而是能在五分钟内清晰说明“这个系统是做什么的”,避免将技术细节与业务混杂讲解。 在技术层面,作者主张先宏观后微观。先确认整体技术栈(如Java或.NET),再借助一张系统架构图理清外部集成与内部模块划分。对于模块和层次,作者特别指出很多系统的问题在于模块职责模糊、依赖混乱,而清晰的分层结构是现代系统的关键。深入细节时,应从集成点入手(如了解MQ中传输的是XML),再探查源码目录结构,但不必在初始阶段过于深入。 最后,团队运作方式同样重要,例如站会、迭代会议的时间安排,是否存在常规的Code Diff或Session分享墙,以及与客户是否有定期沟通机制。作者通过这些问题往往能快速识别团队协作中的潜在问题。整体来看,这套结合业务、技术与团队维度的系统性了解路径,能帮助开发者在一到两天内建立对项目的完整认知,为后续高效协作打下基础。