再谈工程师成长——从代码评审到新人培养

作为初入软件开发的新同学,你是否经常觉得对比老司机们,自己的代码质量一般,但又不知道如何快速提升? 作为模块负责人,你带着几名新人,是否经常苦口婆心的提醒他们要提升代码质量,但又苦于无法高效提供帮助? 作为团队Leader,你是否在多次宣讲代码评审规范,增加大量流程后,发现情况并没有好转,团队代码质量依旧不高,尤其是新同学的代码质量提升很慢,线上问题频出,代码评审流于形式? 本文将基于最近在团队内施行的代码质量提升培训计划,从代码评审出发,展开对新手工程师培养的讨论,借此对该计划进行总结,聊聊关于新人培养背后的思考。

2024/10/20
阅读更多

浅谈代码架构设计

老Y是一个有着十多年经验的软件开发工程师。下面是老Y和代码架构设计有关的故事。 在软件开发者的职业生涯当中,一定会遇到大量关于代码架构方面的名词,比如“可维护性”、“可扩展性”、“高内聚低耦合”、“组件化”、“分层架构”、“SOLID”等等。在短短几十年的计算机历史中,涌现了大量有关软件架构的经典著作,对架构进行了极其全面又深入的讨论,这些著作基本来自于在软件行业有着数十年经验的大神们。既然已经有了这些全面、系统、深入的架构著作,为什么还要写这篇文章?

2024/3/5
阅读更多

浅谈工程师成长——关于成长的三个小故事

Stay Hungry, Stay Foolish —— Steve Jobs 成长是一个长久的话题,尤其是我们身处科技爆炸的信息时代。吴军在《浪潮之巅》中说: 科技的发展不是均匀的,而是以浪潮的形式出现。每一个人都应该看清楚浪潮,赶上浪潮,如此,便不枉此生。 —— 吴军 我们也同样处于这样一股浪潮之中,这是最好的时代,过去几十年中的技术变革超过了数百年,我们每天都有可能做着改变世界的事情,一行代码可能影响数以千万的用户。这也是最坏的时代,面对着技术的爆炸式更新,技术以比以往任何一个时候都快的速度被淘汰,每个人都面临着巨大的压力,焦虑时刻伴随着我们。

2022/6/24
阅读更多

追查闪退的六个日与夜

老Y是一名iOS开发,近日在工作遇到一个闪退,临近提交App Store时才发现,虽然紧急修复后顺利提交审核,但由于问题暴露的时间过晚,因此引起了众多额外的关注。问题本身理应很容易发现,但为什么临近审核才反馈,老Y为了分析该问题,花了六天的时间才找到原因。在一个具有数百个模块的大型App中,如何根据各种蛛丝马迹找出问题根因?本文记录了老Y追查该问题的六个日与夜。

2021/1/6
阅读更多

让小白PPT更加专业的设计书

前段时间在制作一个PPT时,效果总是不尽如人意,各种图表与文字完全不知放在哪里才合适。试了很多所谓好的模板,但很难将想要呈现的内容与这些模板完美的融合在一起,只能够生搬硬套模板中的样式,一旦版面的内容有所不同时,套用出来的效果就变得很差。网络上的PPT模板千千万,哪款才是适合的那一个?于是想着有没有一些通用的制作PPT的原则,可以让我们设计自己的模板,对于包含很多图表、数据、文字的页面,如何设计才能够让整个页面看起来没有那么业余,虽不一定要精美,但总不致于到难看的程度。看了很多介绍如何设计PPT的文章,但大多给出了结果,但不知道为什么要这么做,遇到自己的场景时依然没有头绪。还有很多文章都是介绍如何制作酷炫的动画,在使用PowerPoint的层面,这些都是术,有没有一种从更高层次来介绍如何设计的书?经过一番搜索,最终找到这本《写给大家看的设计书》。 所以这是一篇《写给大家看的设计书》的读后感,可能对于与我一样在制作PPT过程中充满困惑的朋友们有所帮助。

2019/7/2
阅读更多

WWDC之AR

进入iOS开发这些年,今年终于有机会去参加一次WWDC,朋友们笑称,这是趟朝圣之旅,我想也并不为过。

2018/7/1
阅读更多

iOS中如何对具有复杂依赖的SDK在真机上进行单元测试

单元测试在软件开发中一直有着极其重要的地位,iOS的开发也不例外。随着App规模的不断膨胀,开发也逐渐的趋向模块化,开发者常常以库的形式封装功能,最后组成App。此时由于App结构变得复杂,各种库又可能存在着相互依赖的缘故,单元测试也随之变得复杂起来。开发者可能面临着一系列问题,比如:单元测试如何处理这些依赖?如何在真机上运行测试?如何在App所在的环境中运行测试?本文将用一个模拟的开发环境逐一进行讨论。

2016/2/16
阅读更多

如何处理iOS中照片的方向

使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现导出的照片方向会有问题,要么横着,要么颠倒着,需要旋转才适合观看。而如果直接在这些设备上浏览时,照片会始终显示正确的方向,在Mac上也能正确显示。最近在iOS的开发中也遇到了同样的问题,将拍摄的照片上传到服务器后,再由Windows端下载该照片,发现手机上完全正常的照片到了这里显示的横七竖八。同一张照片为什么在不同的设备上表现的不同?如何能够避免这种情况?本文将和大家一一解开这些问题。

2015/5/30
阅读更多

跳出手掌心——如何立即触发UIButton边界事件

最近在使用UIButton的过程中遇到一个问题,我想要获得手指拖动button并离开button边界时的回调,于是监听UIControlEventTouchDragExit事件,如文档所述: An event where a finger is dragged from within a control to outside its bounds. 这个事件正是我所需要的,可是最后却发现当手指离开button边界时,事件并没有触发,而是到了远离button近70个像素时才收到回调。

2015/5/20
阅读更多

知无涯之回车换行的故事

不知各位有没有过这样的经历: Linux上创建的文件在Windows上打开时,结果所有内容会挤成一行。而Windows上创建的文件在Linux上打开时,每一行的结尾又多了一个奇怪字符^M。 在安装Windows版的git时,安装向导在某一步会提示你选择”Configuring the line ending conversions”,里面提到了Windows-style和unix-style的line endings,为什么会有这些呢? 调用C语言的API fopen时,会有text mode和binary mode,这两者有什么区别? 其实这一切都和我们常说的回车换行有关,但你有没有很奇怪,什么是回车?直接用换行不就好了,为什么要分开两个词?我们使用的键盘上的键明明起得是换行的作用,为什么叫回车?千万别被绕晕了,本文将和大家讨论有关回车换行的一段有趣的历史,随后将回答这些问题。

2014/12/16
阅读更多

ssh连接远程主机执行脚本的环境变量问题

近日在使用ssh命令ssh user@remote ~/myscript.sh登陆到远程机器remote上执行脚本时,遇到一个奇怪的问题: ~/myscript.sh: line n: app: command not found app是一个新安装的程序,安装路径明明已通过/etc/profile配置文件加到环境变量中,但这里为何会找不到?如果直接登陆机器remote并执行~/myscript.sh时,app程序可以找到并顺利执行。但为什么使用了ssh远程执行同样的脚本就出错了呢?两种方式执行脚本到底有何不同?如果你也心存疑问,请跟随我一起来展开分析。

2014/11/10
阅读更多

以普通用户启动的Vim如何保存需要root权限的文件

在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误: E45: 'readonly' option is set (add ! to override)

2014/7/29
阅读更多

NBA 38大催泪瞬间:假如

此篇文章无关乎技术!献给热爱篮球的朋友!

2014/7/17
阅读更多

知无涯之std::sort源码剖析

从事程序设计行业的朋友一定对排序不陌生,它从我们刚刚接触数据结构课程开始便伴随我们左右,是需要掌握的重要技能。任何一本数据结构的教科书一定会介绍各种各样的排序算法,比如最简单的冒泡排序、插入排序、希尔排序、堆排序等。在现已知的所有排序算法之中,快速排序名如其名,以快速著称,它的平均时间复杂度可以达到O(N logN),是最快排序算法之一。

2014/5/20
阅读更多

知无涯之C++ typename的起源与用法

侯捷在Effective C++的中文版译序中提到: C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, object-based, object-oriented, generics 对于较少使用最后一种泛型编程的我来说,程序设计基本上停留在前三种思维模式当中。虽说不得窥见高深又现代的泛型技术,但前三种思维模式已几乎满足我所遇到的所有需求,因此一直未曾深入去了解泛型编程。

2014/5/7
阅读更多

深入理解log机制

最近在部门内部做了一个关于log机制的知识分享,深入的探讨了log机制中各种概念的来源、常用log库的用法、内部处理流程,以及如何在一个涉及多台主机的复杂系统中部署log等问题。本文是对这次分享的总结,将对这些问题一一展开介绍。

2014/4/6
阅读更多

记一次当前工作目录问题的排查经历

最近在使用ClearCase的时候遇到一个问题,当从命令行里启动版本树,并想给一个节点打上review属性时,经常会出现一个命令窗口一闪而过,刷新版本树之后却没能找到想要打的review属性,只有再次尝试才会正确打上。大家忍受了这个问题很久,但一直都没时间去深入分析它。在连续几次遇到这情况之后,我觉得忍无可忍,下定决心解决它,最终找到了问题的根源并给出了解决方案,在这里详细记录一下这次排查的经历。

2014/3/6
阅读更多

谁打印了这个字符串

前段时间在调试时遇到一个问题,运行程序出现错误,但并没有足够的信息来定位错误所在。可喜的是控制台上输出了一些可疑信息,只要找到了哪里打印了这些信息便有可能推断错误的原因。然而由于程序过于庞大,不可能一步一步跟踪调试去查找哪条语句执行后输出了这段字符串。尝试在所有的代码中搜索这段字符串也无功而返。后来突发奇想,能否在输出字符串时设置一个条件断点,只要输出的这段信息就中断,这样就可以在中断后找到何处打印了这些可疑信息,进而解决程序的问题了。

2014/1/14
阅读更多

跟我一起学习VIM - The Life Changing Editor

前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程。虽然准备有限,但分享过程中大家大多带着一种惊叹的表情,原来编辑器可以这样强大,这算是对我多年来使用VIM的最大鼓舞吧。所以分享结束之后,将这篇简短教程整理一下作为我2014年的第一篇Blog。

2014/1/6
阅读更多