Part 1. 谈职业生涯
一、给年轻程序员的 10 点启示
- 正确认识自己
- 找到能真正反映你内心的词汇来定位你自己,通过努力,你会慢慢变成你希望的样子。
- 比一般人更努力
- 周围所谓的天才只是在你没看到的时候花了更多时间工作或者学习而已。当你也坚持这么做时,你也会变得和他们一样优秀。
- 适时建立个人权威
- 选择合适的时机去表现自己,建立个人权威,让其他人看到你的不同之处,并为你在公司或团队内部构建起良好的影响力。一切的前提是不断努力积累自己的实力,并在恰当时候展现它。
- 遵循最佳实践
- 尝试去理解软件领域最本质的东西,去学习那些最佳实践。
- 保持好奇心并乐于探索新的事物
- 有很强的意愿去了解更深入的东西,对提升程序员的技术深度非常有帮助。
- 乐于探索看似与工作无关的技术,会促进原有技能的提升。因为技术相通,能互相带来有价值的启发。
- 抛开代码与人沟通
- 忽视与人的沟通,对职业生涯发展不利。
- 需要与人沟通获得他人的帮助;需要与人沟通建立良好的工作关系;能力不断提升,被赋予更多职责时,需要与人沟通来管理好自己的团队,以及与老板或客户进行有效的沟通。
- 要为优秀的人工作
- 环境对一个人的影响巨大,最可怕的是当你身处其中时,很难意识到你正在变得越来越糟。
- 不要盲目跳槽,选择一个更好的环境,尽可能与那些优秀的人一起工作。
- 生活、睡眠、旅行
- 生活:尝试有节制和有规律的生活,程序员生涯不是一次冲刺跑,更像是一场马拉松。合理规划自己的时间分配(学习、阅读、写代码)并持之以恒地去做。不忽视家庭,做一个快乐友爱的程序员。
- 睡眠:长时间熬夜会带来恶性循环,反而使工作效率变得更低。保证充足的睡眠将使你变得更加强大。
- 旅行:旅行的意义在于发现和感受新的东西,而这些是从电脑屏幕上无法获得的。
- 相信自己的天赋和创造力
- 需要在生活中不断地培养和发掘自己的天赋和创造力
- 方法一:阅读优秀的书籍,从书中寻找能激发你创意和灵感的优秀内容
- 方法二:记录和收集:小本子记录转瞬即逝的好想法。
- 方法三:尝试动手,有工匠精神的人,通过亲自动手去尝试和实践,会不断从中得到新的创造力。
二、程序员的职涯经验
- 你的薪酬与你的工作量无关
- 取决于很多因素,技术能力,经验资历,工作量,本质是,你对公司是否重要,也就是你的不可替代性。
- 摆正心态,正确认识自己在公司中的位置,努力修炼内容,让自己变得越来越重要,薪资自然会提升。
- 尽可能持续做一件事
- 指技术上的积累,也是指你能完整或较长时间参与同一个项目或开发一个产品。
- 持续做一件事是要把每一件事做透、做好,而不是蜻蜓点水,浅尝辄止。
- 唯一不变的就是变化本身
- 使用的技术,软件领域的实践方法,所做的项目,公司的组织架构,自己的职位和角色在变,老板也如走马灯般换来换去。
- 如何应对变化?你很难去改变所处的环境,或是阻挡那些变化的大趋势。你所能做的恰恰是培养自己持续学习的能力。
- 你需要提升自己快速学习的能力,当你学得越多,往往就能够学的越快,因为知识之间总是存在关联性。慢慢地,你会发现自己能够非常地面对那些不断出现的变化,甚至可以提前预判趋势,当机会来临时,总能成为那个有准备的人。
- 你的声誉非常重要
- 优秀程序员在团队和公司内部都有着良好的声誉。
- 声誉除了和诚实守信,踏实肯干有关外,特别重要的是严谨。这是判断一名程序员是否具备优秀潜质的重要因素。
- 严谨的程序员对于分配给自己的任务认真理解,对自己的产出会仔细检查,这些能大大减少工作中的出错概率,给团队和公司中其他人留下良好的印象。
- 你可能需要很长时间来建立自己的声誉,而一次因不够严谨所导致的错误,就可能让你彻底失去它。
- 理解沟通的意义
- 去理解用户真正希望解决的问题。
- 引导最终用户接受我们提出的专业方案或设计。
- 你的右脑将是你成功的关键
- 非技术能力是很多大牛获得成功的关键。
- 文档排版、多视角看待问题、PPT、演讲。
- 很多技能总是在你看不见的地方互相作用和促进的。
- 不要轻易说简单或不可能
- 不应该轻易做出那些过于绝对的判断,应尽可能使用科学的方法进行分析和论证,然后用不易被人误解的方式进行有效的表达,这样你提出的观点才能让大家感到信服。
- 你不应该总是单打独斗
- 具有影响力的东西,靠个人很难实现。
- 学会团队协作,尽可能让优秀的人围绕在你身边,这将扩展你的能力范围,让你变得更加强大。
- 你的能力显而易见
- 优秀程序员无时无刻不在体现他们的能力,从轻松解决技术难题,到会议上提出被一致认可的解决方案,以及他们写出的那些优雅且完善的代码,这些都让他们显得与众不同。
- 能力来自大量的编码实践,持续的学习能力和勤于思考的习惯。
三、如何找到靠谱的程序员
- 简历看人。错别字,项目经验,与编程相关的社会化活动。
- 给面试者介绍自己最擅长的
- 对所做的事情是否充满激情
- 团队中是否有效沟通
- 专业领域是否足够擅长
- 团队是否乐于和这个人一起工作
- 基础是否牢靠
- 技术深度够吗?
- 适合企业文化
- 行为面试法:是否有较强的独立解决问题的能力。
- 给一个虚拟任务
四、每个程序员都应该了解的一件事
自我营销的能力,会帮助你脱颖而出并获得成功。
你写的代码可能毫无用处,直到:
- 人们理解你在做什么。
- 人们对你所做的事情感兴趣。
- 人们为你所做的感到兴奋和激动。
自我营销可以放大你的努力,在你成功路上起到催化剂的作用。
提升自我营销能力的几个方法。
- 读与技术无关的书。丰富知识和思想,使你更加全面和完善。
- 会写文档。优秀文档帮助你建立声誉,信任,和好感。
- 学会包装
- 知道什么是美的(优秀的)。
- 精心制作。
- 尝试多讲。跨越两道障碍。
- 敢说。
- 让说的和你想的一致。
- 建立社会化联系
- 社会化活动
- 技术博客
- 社区讨论
- 社交网络
五、程序员的烦恼
1. 是否留在一线城市
资源多,充满挑战和机会。
买房本身并不会给你带来持久的快乐,因为当你买完房后,你会欠一大笔债,需要用几十年才能还清。
2. 小公司做的事情太繁杂
公司就像是围城,外面的人拼了命想进去,而在里面的人却都想逃出来。
杂事不杂。在与技术无关的事务中找寻意义,获得沟通能力、管理能力、建立更广的人脉,在企业内部建立影响力。
六、提给年轻程序员的职涯建议
- 尽早确定你想做的事情
- 一万小时定律
- 提高工作效率
- 加快工作节奏
- 借助工具完成工作
- 简明的沟通方式
- PKSS 与持续学习
- 学会控制情绪
- 让优秀的人围绕在你身边
- 善于归纳与表达
- 掌握英语
- 睡眠使你更加强大
Part 2. 谈实践与认知
一、突破程序员思维
1. 什么是程序员思维
常人思维+编程思维,长期相互作用下产生的思维模式,帮助程序员快速找到以程序方式解决现实问题的最优解。
获得途径:
- 长期不间断地编码实践
- 持续学习借鉴参考
- 学会反思,像专家一样思考
2. 为什么要突破程序员思维
- 从设计、运营、产品等不同角度去进行分析和判断的能力。
- 转型过程中,更人性化的角度去识别和解决问题。
- 改善生活,加强沟通
3. 如何突破程序员思维
- 透过技术发现问题的本质
- 像专家一样给出意见
- 杂学并从中获得不同的视角
- 找回创造力
- 每天阅读,每周博客上记录自己想到的东西
- 小本子记录转瞬即逝的想法。大部分当时不会产生什么实际价值,但下一个优秀的创意或想法,可能就来自它们。
突破程序员思维不是要摒弃它,而是建立在成熟的程序员思维之上,帮助程序员以更全面的视角去思考和解决问题,同时也能为程序员这个职业创造出更多可能。
二、全栈工程师如何快速构建一个 Web 应用
- 网站定位与功能设定
- 信息架构
- UI 设计
- 应用架构
- 开发
- 部署
- 性能调优
- 网站数据统计
- 开发与设计工具
三、如何成为一名优秀的全栈工程师
1. 什么是全栈工程师
注重强化自身的核心技能,关注并乐于实践其他技术。
往往是某一方面的专家,同时通晓并善于在正确的场合运用其他语言、工具和技术。
2. 全栈工程师的价值
- 个人价值及自由度的极大提升
- 全局思维与技术前瞻性
- 降低沟通成本
- 初创公司
3. 全栈工程师的技能栈
- 关键开发技能(硬实力)
- 至少一门编程语言
- 运用开发框架和第三方库
- 前端技术
- 数据库与缓存
- 基本设计能力
- 附加技能(软实力)
- 沟通
- 问题解决能力
- 时间管理
- 好奇心
- 领导力
开发技能是你的硬实力,附加技能是你的软实力。
4. 优秀的全栈工程师需要走出去
- 参加技术大会——InfoQ、CSDN、GITC。
- 做公开演讲。
- 个人博客。
- 参加线下活动。
四、学习使用命令行
熟练使用命令行是程序员的基础技能。
- 有效控制你的操作系统
- 编写自动化角标,从重复性工作中解脱出来。
- 用 Git 来做版本控制
- 前端开发依赖于命令行工具
- npm
- sass、less
- grunt、gulp
- jade
- 如何学习命令行
- 从基本开始,反复尝试,逐渐习惯
- 编写自动化脚本帮助你完成工作
五、重构——系统改善之道
系统就像汽车,要经常维护和保养,才能保证它的良好运作。
持续重构就是给系统做的保养。
以下为系统重构工作的最佳实践。
1. 从构建工具开始
问题:
- 自动化程度低下。
- 缺少有效的包依赖与版本管控。
- 缺少自动化测试覆盖。
- 不利于团队构建。对新人不利。
解决:
- 引入构建工具。
- 第三方包依赖与版本管理。
- 实现自动化。
- 写入开发手册。
2. 让自动化测试成为重构的保障
关键功能重构所采用的步骤:
- 详细 Review 该功能的需求。
- 针对需求,完善自动化单元测试案例。
- 将这部分单元测试的执行引入到每次自动化构建中。
3. 代码级的持续重构
时间越长,代码越糟:
- 重复的代码
- 不一致或没有标识性的对象、变量或方法命名。
- 过长的代码段。
- 让人费解的布尔表达式。
- 过于复杂的逻辑判断。
- 对象错误地暴露其内部状态。
- 遭废弃但没有删除的类或方法。
代码坏味道。利用 IDE 的判断。
4. 基于微服务的重构
SOA 的一次升级。
- 服务识别。
- UI 与服务的隔离。
- 构建服务。