程序员的成长之路 产品、技术、团队

背景

其实这是一篇读书笔记,读过《奔跑吧,程序员:从零开始打造产品、技术和团队》这本书有段时间了,主要是利用上下班的时间在网易蜗牛中阅读APP中阅读的,总共耗费了800分钟左右的时间其中包括这篇笔记,想看这本书的原因是最初在某篇文章中看见推荐这本书的英文版《Hello, Startup: A Programmer's Guide to Building Products, Technology, and Teams 》,那段时间也正好在思考自己的职业发展相关的事情,就不约而同把这本书加入了自己的待读清单中,看英文书名就知道是一本关于技术人员成长的书籍,这本书英文版出版也有好几年了,国内翻译出版的时间也比较晚,苦于自己英语阅读能力有限啃起“生肉”也比较吃力,在加入待读书单有段时间后正准备“吃生肉”的时候,发现图灵的公众号正在征集出版该书的书名,最后也知道该书会在国内翻译出版,也就只有继续等下去了,对于书名真的不知道编辑为何会钟意现在这个名字,还是觉得中文版的书名不如英文版的简单易懂点,但副标题又叫从零打造技术、产品、团队这个副标题至少是把该书的主体内容和涉猎的主题的总结,阅读完后5星的话我给该书评分4.5星,因为这本书里面一些概念对我们这些编程技术人员还是一些指导性的建议的.

书籍简介

首先第一章从点子的产生及获取点子需要的技能,产品的设计到后期针对产品怎么进行数据监控和市场营销以及为什创业?大公司和创业公司优缺点等给了一些概念和建议。然后第二章技术上叙述如何从技术栈上选择适合当前开发产品的编程语言、服务器框架、数据库类型以及在编程过程中如何输出整洁、松耦合、可扩展性的代码到具体软件交付时所需要做的工作步骤给了一些建议。最后对团队这个主题从创业团队文化如何融入创业文化到具体的各个环境中,如何招聘合适团队的成员、技术人员如何学习提升自己的一些建议和技巧。

产品、技术、团队

在极度不确定的环境下,以探索的运行模式,寻在一种可重复、可扩展的商业模型,并以大幅增长为目标的组织.

其中对是创业团队其实就是把自己的一些想法以探索的方式通过计算机技术,形成解决某一领域问题的方案并发布给用户使用,作者还说明了创业公司和大公司的优缺点,这个也可以作为在选择某些公司offer时的参考。

产品:从点子的产生到产品发布的过程

创业是成千上万次重复“发现问题-想出点子解决问题-执行这些点子”,验证解决问题的点子是否具有商业价值

创业点子是一个发展和进化的过程,并不是闪现出来的的产生额,点子的产生是可以通过提升成为T型人才、培养创造力环境、经验积累、模仿大量已经存在的点子等因素产生的,这里创造力离不开:模仿、转换、合并,书中提到了通过培养创造力环境:给自己充足的时间、记录点子日记(备注、目标、意见、想法、问题、草图和观察到的东西)、解决问题、放下工作、添加约束、寻找痛点、与他人交谈来解决点子缺少的情况。

产品开发过程中需要注意的是, 迭代产品过程,以用户为中心,完成比完美更重要,但怎么以用户为中心进行产品设计呢?作者给出的建议是使用客户开发方法1来解决.

最后产品发布以后需要对产品进行营销和数据的追踪,从数据上可以通过对产品设定一定指标并每天对指标进行调整,并以市场数据驱动为准则来开发产品相对应的功能。在营销方面主要通过口碑、市场推广、销售和品牌化进行,这里其实创业公司前期推广经费有限的情况下积累用户都是通过口碑和精准市场进行,相反则可以通过大量的销售推广方式和砸钱买量的方式进行,但如果在对推广市场用户不够精准的情况下,会导致产品用户的留存会很低。

技术:编程语言、数据库、框架、代码的维护、软件的交付

如何选择适合当前产品的技术栈及编程语言、数据库、框架,以及如何开发出整洁并具有可扩展性的代码.开发完产品建立交付过程,通过处理编码完成后各个关键步骤:构建、部署、监控,以减少交付过程的痛苦.

技术栈不是产品,只是工具实现产品的手段。关注如何构建可以不断进化的技术栈,不要太多的关注当前什么是“最佳的技术栈”

“如果你不能确定框架是否满足自己的需求,其实可能是没有很好地理解框架或者自己的需求,不妨进行更多研究,再多做一些原型。”

熟悉什么就用什么,如果发现开发新功能时间和发布产品的时间太长就需要去扩展和更新当前的技术栈了,采用渐进式进化的方式进行改善,不必重头开始重新造轮子。作者的这个观点比较赞同,真的前期不需要太多的考虑框架和库还有编程语言的性能,可以在产品发布后根据具体的需求和收集到数据的分析在来进一步优化和改善.在框架和库的选择上也要避免,关键业务不要使用未经验证的商业解决方案,但自己从零开始造轮子又着需要花费大量的时间成本,使用开源代码质量和更新修复时间可能会无法控制,但好在使用开源代码自己可以对出现的BUG进行修改源代码,在选择库和框架上尽量采用选择精简而非全栈的原则

编程语言的选择采用能提升生产效率,考虑是否有大部分适用当前产品特征的解决方案库或框架,性能上可以从垃圾回收和并发性,数据库的选择根据数据库类型,选择的时候考虑读取数据、写入数据、模式、可扩展性和成熟度

如何做到开发出松耦合、具有可扩展性、高内聚、整洁的代码?

整洁的代码应该遵循依赖反转原则, 高级的模块不应该依赖于低的模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

整洁的代码所遵循的一些原则: 专为人理解而优化

  • 代码的布局 : 遵循代码布局规则,清晰的表达程序的组织。强制实施一整套代码布局的约定,包括空白、新行、缩进和大括号的使用
  • 命名 : 好的名称应该能回答所有的重要问题,应该精确描述代码是做什么?和为什么做的?、全面反映是什么、为什么和怎么样,能够揭示意图,并且整个项目中至始遵循约定
  • 错误处理 : 抛出异常、打印日志、上传日志
  • DRY(Don't repeat yourself) : 避免开发重复功能
  • 单一职责 : 每个类或函数只有单一的目的
  • 函数编程 : 使用函数或组合函数作为应用程序的构建块
  • 不可变的数据 : 对程序中通用对象进行类型化
  • 高阶函数 : 把其他函数做为参数的函数
  • 纯函数 : 输入参数进行转换输出结果
  • 松耦合 : 降低模块和类之间的相互依赖,尽量使用参数传递,使用API降低对库的依赖
  • 避免使用全局变量
  • 高内聚 :从一个庞然大物转到若干专注、高度内聚的类, 所有的变量和方法都有关联,都应该在同一层次上抽象操作,每部分都很好的配合使用
  • 注释 : 尽量让代码告诉你做什么,少用注释,遵循不同编程语言的注释规则,避免无意义的说明

重构 : 增量式的改进,每次对内部实现细节进行理解并进行最优的小改动

先做纯粹重构,再做纯粹扩展 — Deam Thompson,Transarc公司、Premier Health Exchange、Peak Strategy和Mspoke联合创始人

怎么做到编写出具有可扩展性的代码

可扩展属性不是一个布尔值,在创业公司一切都在不断的变化,应该把实践花费在提供开发团队效率的工具和实践上,如果你已经到了害怕修改代码的地步,就意味着你需要在编码上进行扩展,以适应增长的需要。

编码过程中的扩展:应对更多的开发人员、代码和复杂性需求 (项目前期)
  • 自动化测试 : 迭代代码测试循环的优势
    • 单元测试 - 验证单独小单元(函数、类)代码的功能
    • 集成测试 - 测试若干类或模块、整个子系统如何一起工作,允许产生副作用并对外部环境存在依赖
    • 冒烟测试
    • 验收测试 - 代码是否正确的解决客户问题?验收用户的行为以及产品产生的结果
    • 性能测试 - 验证系统的负载和故障时的稳定能力
    • TDD 测试驱动开发: 测试-开发-测试
  • 代码分离
    • 努力的让代码的规模尽可能最小,将代码分离成多个“片段”
  1. 把尽可能多的工作委派给基础代码外的开源和商业函数库实现
  2. 使用编码风格简介、减少样板文件引用和重复的编程语言来实现
    • 常见的抽象类型:接口与模块、版本化组件、服务(把某类功能放进一个进程,通过消息去和进程通信而非函数调用)
    • 代码评审 : 设计评审、结对编程、提交前评审、静态分析(通过自动化工具来进行编译检查)
    • 文档
扩展代码的性能: 应对更多的用户、流量和数据需求 (项目后期)
考虑性能或软件开发的基本过程就是让它工作,让它正确,让它快速,这是几个连续的步骤,必须按顺序去实现
  • 测量 : 使用工具对代码进行测量,收集需要优化问题的数据,分析数据找出瓶颈
  • 优化策略先进行估算,判断那种策略有效最优
    • 分治(把问题划分成许多小问题)
    • 缓存(提前执行任务得到结果)
    • 懒惰(推迟任务,稍后在做)
    • 近似正确性(得到一个“足够接近”的答案)
    • 异步、抖动和随机化(将负载均匀扩散开)
    • 节流(拒绝会拖慢计算的地方)
    • 冗余(剔除一次以上相同的计算并返回最快完成的计算)
    • 协同定位(物理上更接近的东西放在一起降低延迟)
    • 更快的硬件
    • 更快的算法(找出可以减少工作量的算法)

交付软件正确的姿势

建立交付过程,通过处理编码完成后各个关键步骤:构建、部署、监控,以减少交付过程的痛苦

构建相关

  • 版本控制
    1. 编写良好的提交信息
    2. 经常提交及早提交 PS:最好按单改动来进行提交
  • 构建工具:编译、运行、测试
  • 持续集成
    1. 提前作出所有组件的设计,然后让每个团队独自实现单个功能
    2. 做出所有组件的初步设计

团队: 创业文化、求职招聘、学习

创业文化是员工分享并通过他们的举止和行动表达出来的信念、设想、和原则。

我们要做一家伟大的公司,而每一家伟大公司的核心都是伟大的文化,一种能够让我们相处新点子、新规划、新产品的环境。

如何塑造创业文化,文化又是由公司的使命和核心价值组成的核心理念, 作者给出定义公司核心理念的方法把团队领导关在屋子里面几天讨论然后做出决定。使命是清楚的表达公司的目的,好的使命必须简洁、清晰、永恒并鼓舞人心,定义使命可以从为什么-怎么做-做什么开始。核心价值是组织中用来做出每一个决定的信条。再把得出的核心理念应用到组织设计、招聘和晋升、激励、办公室、远程办公、沟通和过程中。

以什么样的组织结构,经理驱动等级还是分布式组织结构来,扁平和分布式组织会让员工有更多的自主权和责任心,招聘与企业文化相一致的人,对技术人员的晋升方式通过代码对公司的贡献来提升影响力,职业提升阶梯等同与管理人员,每一个等级的报酬、承担的责任已经在公司的影响力都大致相同于同级别的管理人员,不要让技术人员觉得是二等公民.还有一种晋升方式不关注头衔给予新责任、新的报酬和好处来嘉奖。

激励采用晋升和奖金的方式,只在任务无聊且重复的情况下进行,才能提高员工的表现。营造一种最大程度放大自主权、专业能力和目标的环境激发内在激励因素,为了控制自我生活,把事情做的更好,从事一些有较大意义的事情。

沟通就是你如何传播你的文化以及如何改变它应该说什么和不应该说什么,内部沟通尽可能做到“透明”,定期让员工了解公司优先考虑的事情(目标)、公司正从事什么项目去实现目标(如何做)、过去有什么项目成功了或失败了、了解公司的财务表现。找到适合组织透明程度的外部沟通之前,可供考虑的三条:

  1. 如何设计、营销、推广你的产品
  2. 如何通过blog、开源软件宣传自己公司
  3. 如何和客户沟通

在文化上要做好,只需要采用出色的判断,出现错误后,记录,讨论,修复错误,尝试建立自动化解决方案避免错误。

做一个实干家要有自己组织的核心价值、使命,组织设计尽量以分布式管理为主避免使用“权利”大与自主,避免完全用管理作为晋升渠道方式导致工程师不能发挥它的最大才华,激励组织成员的最好方式是给予更多的自主权和对应的目标把他们专业能力发挥到最大,

求职招聘

最好的找工作方式是“人脉”,以聚会小组和会议、黑客马拉松和比赛、演讲、blog和开源来发展人脉,面试时要习惯在思考问题时说出来,通过了解自己,通过网络搜索了解对应的公司,对拿offer如何评估和谈判,薪水、股权、福利、谈判的概念

招聘人员需要确认优先选择和自己企业文化契合的人,创业公司招人的前提是确定当前招聘的岗位会不会影响当前产品项目的开发,再思考招聘的目标什么?对当前组织所缺成员角色的定义,可分为:合伙人、早期员工、后期员工、有能力的开发者,可以通过推荐、简历投递、人事筛选等渠道去获取,

学习

明智的去选择技能建立一种知识投资组合2,精通一个学科的知识,对其他学科要有广泛的涉猎成为T型人才。投入时间学习让自己变的更加出色,让学习成为生活中固定的日常任务。三种常见的学习技巧:

  • 定期花时间去阅读和研究感兴趣或专业的技能相关知识
    • 设定具体的可测量的目标
    • 记笔记:简单记录下新点子、问题、已经阅读点子日记过程中产生的想法
    • 让你的朋友或同事参与到学习过程中
  • 把学习到的知识通过个人项目或开源项目、当前工作项目等途径进行验证
  • 分享:通过什么途径分享学习到的知识,什么应该分享?什么不应该分享?

1

《四步创业法》-Stven Blank

2

《程序员的修炼之道》