├── README.md ├── SUMMARY.md ├── about-functional-programming ├── essence-of-programs.md ├── javascript-functional-parts.md ├── this-features-make-language-difference.md └── why-i-broke-up-with-oop.md ├── about-web-dev ├── choose-programming-languages.md ├── good-understanding-keeps-design-simple.md ├── how-to-evaluate.md ├── principle-of-hurt-once.md ├── problems-in-software-dev.md ├── put-codes-in-right-place.md ├── split-big-problems.md ├── testing.md ├── upgrade-dependencies.md └── why-agile-development-works.md ├── creating-a-great-web-team ├── bian-cheng-shi-yi-zhong-ji-neng.md ├── great-team-cannot-live-without-code-review.md ├── product-released-email.md └── recruiting.md ├── personal-development ├── making-excellent-resume.md └── prefer-good-search-engine.md └── web-dev ├── kill-your-job.md ├── seek-answers-in-specifications.md ├── untitled.md ├── web-dev-vs-frontend-dev.md └── you-need-casual-projects.md /README.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 这将会是一本书,书名暂定《函数式 Web 开发随想录》,我们会在这里记录一些思考 —— 关于软件开发(尤其是 Web 开发领域)的思考。 4 | 5 | 软件行业非常朝气蓬勃,UNIX 时间戳 0 的时间是 1970 年 1 月 1 日,距今才 40 多年。40 年间,各种技术不断涌现,很多事情已经焕然一新。然而行业中的智慧,却未像技术一样不断被超越。软件,目前毕竟还是由人来开发为主,依旧受制于人脑的物理限制。人脑的表现在这些年(甚至数千年)并没有巨大的改变。 6 | 7 | 也许未来 AI 终究会代替人去进行软件开发,但如果基于「由人开发软件」这个目前的条件,**如何进行更好的软件开发**,依旧是一个值得探索的问题。 8 | 9 | ## 什么是正确的 Web 开发方式? 10 | 11 | 很多人认为这个问题没有答案,因为「正确」很难被定义。确实如此,如果我们没有理解问题,就很难得到答案。 12 | 13 | 但是,如果我们定义「正确」代表着: 14 | 15 | 1. 总是能交付价值,通过软件运行来帮助他人 16 | 2. 总是能持续找到成本最低的方式实现需求 17 | 3. 总是能以较低的成本去维护一个长期运行的软件 18 | 4. 无论是通过培养或招聘,总是能找到胜任的工程师 19 | 20 | 那么,是否存在确定的一些方法呢? 21 | 22 | **我们相信答案是肯定的。** 这个信念指引我们不断去实验、学习和思考,寻找 Web 开发的最佳实践。在这个过程中,我们积累了一些经验总结。回顾这段历程,我们发现这些经验总结也对一些同行有用,因此选择公开出来,与大家一起交流讨论。这就是本书的初衷。 23 | 24 | ## 本书的受众 25 | 26 | 本书的读者群更面向有一定开发经验的软件开发工程师, 除了 Web 开发,相信其他领域的开发工程师也可以从中找到可以印证的观点。 27 | 28 | 本书中的观点大多来自多年的实践总结,一般来说经过了一定的抽象,变成了一些箴言或是原则,需要配合实践才能很好地理解,有些内容可能不是很适合新手程序员。如果你恰好是刚刚入门编程,我很赞赏,但是切莫在没有理解箴言的情况下当做教条去执行,相反,你可能需要的是更明确的、来自导师的指令。 29 | 30 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Table of contents 2 | 3 | * [前言](README.md) 4 | 5 | ## 软件开发 6 | 7 | * [软件开发的困难](about-web-dev/problems-in-software-dev.md) 8 | * [如何选择编程语言](about-web-dev/choose-programming-languages.md) 9 | * [代码库的划分](about-web-dev/put-codes-in-right-place.md) 10 | * [问题拆解](about-web-dev/split-big-problems.md) 11 | * [理解你的需求,是简洁设计的秘密](about-web-dev/good-understanding-keeps-design-simple.md) 12 | * [「受一次伤」原则](about-web-dev/principle-of-hurt-once.md) 13 | * [如何准确评估开发工作量](about-web-dev/how-to-evaluate.md) 14 | * [自动化测试](about-web-dev/testing.md) 15 | * [依赖包升级策略](about-web-dev/upgrade-dependencies.md) 16 | * [敏捷开发为什么能生效](about-web-dev/why-agile-development-works.md) 17 | 18 | ## 关于函数式编程 19 | 20 | * [程序的本质](about-functional-programming/essence-of-programs.md) 21 | * [为什么我和 OOP 分手了](about-functional-programming/why-i-broke-up-with-oop.md) 22 | * [这些特性让编程语言如此不同](about-functional-programming/this-features-make-language-difference.md) 23 | * [Javascript是个混血儿](about-functional-programming/javascript-functional-parts.md) 24 | 25 | ## Web 开发 26 | 27 | * [「Web 开发」和「前端开发」](web-dev/web-dev-vs-frontend-dev.md) 28 | * [关于认知](web-dev/untitled.md) 29 | * [追求:让自己失业](web-dev/kill-your-job.md) 30 | * [你需要有一些业余项目](web-dev/you-need-casual-projects.md) 31 | * [在 Web 规范中寻找答案](web-dev/seek-answers-in-specifications.md) 32 | 33 | ## 团队 34 | 35 | * [编程是一种技能](creating-a-great-web-team/bian-cheng-shi-yi-zhong-ji-neng.md) 36 | * [没有 Code Review 就没有好团队](creating-a-great-web-team/great-team-cannot-live-without-code-review.md) 37 | * [关于招聘](creating-a-great-web-team/recruiting.md) 38 | * [项目上线邮件](creating-a-great-web-team/product-released-email.md) 39 | 40 | ## 个人发展 41 | 42 | * [写一封彰显实力而不失优雅的简历](personal-development/making-excellent-resume.md) 43 | * [Prefer Good Search Engine](personal-development/prefer-good-search-engine.md) 44 | 45 | -------------------------------------------------------------------------------- /about-functional-programming/essence-of-programs.md: -------------------------------------------------------------------------------- 1 | # 程序的本质 2 | 3 | 价值:「程序 = 计算过程 = 数据 + 处理逻辑」,传递我们基于这个认识的一些原则。 4 | 5 | 1. 相比算法,数据结构设计更重要 6 | 2. 提升处理逻辑的可靠性、可复用性 7 | 8 | -------------------------------------------------------------------------------- /about-functional-programming/javascript-functional-parts.md: -------------------------------------------------------------------------------- 1 | # Javascript是个混血儿 2 | 3 | ## 价值 4 | 5 | 高观点下理解Javascript的特性, 有选择地应用它的特性。 6 | 7 | -------------------------------------------------------------------------------- /about-functional-programming/this-features-make-language-difference.md: -------------------------------------------------------------------------------- 1 | # 这些特性让编程语言如此不同 2 | 3 | ## 价值 4 | 5 | 认识到编程语言间到底不同在哪里,我们应该如何学习新的编程语言。 6 | 7 | -------------------------------------------------------------------------------- /about-functional-programming/why-i-broke-up-with-oop.md: -------------------------------------------------------------------------------- 1 | # 为什么我和 OOP 分手了 2 | 3 | 价值: 讨论 OOP 在复用性上的缺点,通过案例来论证 FP 的优势 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/choose-programming-languages.md: -------------------------------------------------------------------------------- 1 | # 如何选择编程语言 2 | 3 | 价值:阐述编程语言选择的看法 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/good-understanding-keeps-design-simple.md: -------------------------------------------------------------------------------- 1 | # 理解你的需求,是简洁设计的秘密 2 | 3 | 价值: 提供保持简洁的最有效的方式。 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/how-to-evaluate.md: -------------------------------------------------------------------------------- 1 | # 如何准确评估开发工作量 2 | 3 | 价值:能够较为准确地评估出工作量 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/principle-of-hurt-once.md: -------------------------------------------------------------------------------- 1 | # 「受一次伤」原则 2 | 3 | 价值:读者可以更好地去理解设计的平衡,如何在持续的维护中,不断让代码更好,同时有不会浪费开发时间。 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/problems-in-software-dev.md: -------------------------------------------------------------------------------- 1 | # 软件开发的困难 2 | 3 | 价值:总结和抽象我们遇到的问题,阐述我们的原则 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/put-codes-in-right-place.md: -------------------------------------------------------------------------------- 1 | # 代码库的划分 2 | 3 | 价值:引入「问题域」的概念,通过合适的架构分层,实现复用。可以解答代码如何归属、模块如何划分的问题。 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/split-big-problems.md: -------------------------------------------------------------------------------- 1 | # 问题拆解 2 | 3 | 价值:学会如何拆解一个大型、复杂的项目。将一个大型工程拆解成模块和任务。 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/testing.md: -------------------------------------------------------------------------------- 1 | # 自动化测试 2 | 3 | 价值:get 重构的方法论。解答:是否应该写测试,应该对什么代码写测试,应该写多少测试,测试代码的维护 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/upgrade-dependencies.md: -------------------------------------------------------------------------------- 1 | # 依赖包升级策略 2 | 3 | 价值: 读者可以了解到一种简单有效的依赖包升级策略,让代码库保持较低的维护成本。 4 | 5 | -------------------------------------------------------------------------------- /about-web-dev/why-agile-development-works.md: -------------------------------------------------------------------------------- 1 | # 敏捷开发为什么能生效 2 | 3 | 价值: 理解敏捷软件开发为什么能生效的原因,而不仅仅停留在执行流程和应用工具。 4 | 5 | 前几天,公司的大牛 沃兹 分享了《领域建模》,因为我是最后才去听的,所以只听了一部分,尽管如此,也收获很多,深有同感。 6 | 7 | 最后讲到敏捷软件开发这一部分,有一些想法先记录下来, 8 | 9 | 说到敏捷软件开发,可能有很多人就会想到 进度看板、快速编码、简单设计、Scrum等等**流程**。 可你有没思考过一个问题:**它为什么能生效呢?** 流程往往容易掌握,也容易**学习**,也更方便被公司执行。 这样就容易产生为了敏捷而敏捷,以至于这两年会有不少 **敏捷已死** 的论调,前些年我和同行交流时,会自豪说我们采用敏捷软件开发, 现在聊时就不好意思说了, 因为他们的HR或管理者会回复,那不是前几年流行的吗?这几年我听说可以使用XXX开发方法,敏捷开发成了流行的服饰,过几年就得换换。 10 | 11 | **敏捷开发为什么能够生效?** 12 | 13 | 所谓的传统的软件开发流程大概是这样 14 | 15 | 需求分析->概要设计->详细设计->编码->测试->维护。 16 | 17 | 并且会重视流程的时间次序,在需求分析和设计阶段往往非常 **全面** 和**小心** ,很怕遗漏什么到后面发现时,这修改成本就大了。 18 | 19 | 也就是说,它基于一个事实, **越后来的修改越难,修改成本和维护成本,会随着时间呈指数级增长**,可能我们可能有在”“软件工程”的书中看过这样的曲线 ,所以我们必须在前面考虑周全,设计全面。 20 | 21 | 这对于软件开发,需求变化没那么快速,需求明确情况下比较好使。 22 | 23 | 而对于Web项目,以及现在的创业型公司,需求其实是边开发边摸索的,很多时候东西没做出来是不知道我们到底要什么,你 **需要的是边做边改才知道做什么**,这样的话这个模型就不符合了。 也就是说根本考虑不周全,也设计不全面,因为待解决的问题不知道是什么。 24 | 25 | 另一方面,如果我们 开发工程师,我更喜欢称我们为“软件工匠” 有一种绝活,**可以拉平上面可怕的指数曲线,让它变成线性**,即让后面的修修改改,揉揉捏捏和前面一样容易 那么开发流程应该怎么设计呢? 26 | 27 | 于是就有了大家熟知的敏捷流程。所以我们都被带进了一个坑,就是忘记了真正重要的是 **维持这条开发成本曲线线性**,那些流程和工具才生效。 28 | 29 | 那如何才能够拥有这条完美曲线呢?而这也是最难的,难的不是不知道怎么做,而 是 **它不是知识,不是流程和工具,而是技能**。需要刻意练习才能获得。 30 | 31 | **区分知识和技能, 对我们工程师来说非常重要**,这也是为什么很多开发工程师终其一生都停留在 **感觉都会,就是写不出来**的阶段,是因为我们是不可能靠看书,看网页,听分享来掌握技能,这道理很简单,就象不可能靠看书来学会打篮球一样。 32 | 33 | 然后,我想简单聊聊如何保持那条线是线性的。 34 | 35 | 我就以 沃兹 分享的两个方面 领域模型 和单元测试为切入讲讲如何真正敏捷开发。 36 | 37 | 软件开发的结果是代码, 代码就是一种信息的表达方式,更准确地说是 **信息的组织方式**。 通过找到一种组织方式来有效地描述问题,不仅可以描述当前的问题,而且可以描述未来的问题。 38 | 39 | 在这种组织方式里,内含很多预先埋好的维度,会存在一种模型,这种模型内含很多维度,在这些维度方向上,可以自由伸缩,而需求的变更或者增添就相当于在这些维度方向上行走。而这样的结构往往是抽象的,却又能够很好地表达问题域的, 这种东西就叫“领域模型“,如果找到这些维度如何设计这个即抽象又精确的抽型就是”领域建模“需要做的事情。 40 | 41 | 上面说的是一种结果,即我们通过某种神秘的力量,或者说上帝视角,一眼看穿本质,直接还原出问题的领域模型,那么我们就能在修改时不那么费劲,能够将那么成本曲线变成水平。 42 | 43 | 但是现实情况下我们不可能拥有这种能力,所以要采用类似于启发式的探索算法。 44 | 45 | 我们只要 **时时保持当前的结构**,让其拥有清晰的维度,而当前所有的问题点都被有序地包含在内,没有特殊的点偏离。 46 | 47 | 然后基于一个事实,世界是连续的,那么变化也是连续,即需求变更尽量千变万化,但总是在当前的条件下出发完成的, 我们就能够保证 后续的维度成本同样可控,使用这种方法就能够 **维持开发成本曲线成线性**,在这种模式下,我们的开发成本会有两方面的支出。 48 | 49 | 第一步是为了保持这个结构不被破坏,所有点都在所描述的维度内。这个过程叫 **重构**。 50 | 51 | 第二步是在上一步的基础上,在预先设计的维度内,很自然上挂上新变更的需求。 52 | 53 | 上面两步就是真正的敏捷软件开发。尤其是第一步非常重要,也最容易被放弃。 54 | 55 | 正因为第一步是敏捷开发的关键,为了使调调整安全可靠,而强调甚至重新定义了 **单元测试**。 56 | 57 | 刚才说到,我们 必须时刻保持模型的有效性,那么免不了持续对我们的结构中的各个部分折折再重新装装。那么如何保证我们各个模块具有这种容易拆装组合的特性呢? 答案就是**单元测试**,因为一个模块能被单元测试,那表示它更容易被隔离,更容易重新拆装。所以单元测试在敏捷开发里最重要是为 **保持被测模块的独立性**,或者以往术语叫低耦合,而不仅仅是测试模块是否正常工作。 58 | 59 | 如果一个模块还没产生前,我们就编写好对它的单元测试,那么这个模块必然具有好的特点,否则它就根本写出不来。 60 | 61 | 因为就两种情况: 62 | 63 | 一是已经有模块了,要添加单元测试,那么模块特性好,我们才能更容易添加单元测试,如果太复杂不好添加单元测试,这并不阻止我们继续完成功能,所以多数情况下就会放弃对这个模块的单元测试,最多写上一个TODO,让自己的心里好受些。 64 | 65 | 第二种是,如果先有单元测试,再写实现模块,那么你要把工作进行下去,唯一能做的就是调整单元测试,直到写出模块,然后模块自然具有优秀的特性。 66 | 67 | 这就是TDD,这里的重点是,TDD的T和D不是说先写完好多模块的测试,再写它们的实现,我更倾向于把它看成一个模块包含的两个不可分害的两部分,测试和实现,它们可以交替,轮流,反复,伴随而产生。 68 | 69 | 所以我觉得让敏捷软件开发真正起作用的是,我们应该在开发过程中应用以上实践,只是上述过程并不是个流程,而是个技能,所以需要刻意练习才能得以实施。 70 | 71 | 最后再谈谈简单设计, 有好多对敏捷开发不怎么了解的以为敏捷开发不重视设计,其实经过刚才的分析, 我们知道 **设计在敏捷开发中并不是一步流程,而是贯穿整个开发周期**, 只要还在维护,修改代码,就在时时设计。 上面描述的第一步其实做的就是设计。 72 | 73 | 所以这也是为什么说: 74 | 75 | **重构就是设计**, 这里的设计是动词。 76 | 77 | 相对应的还有一句话: 78 | 79 | **源代码即设计**, 这里的设计是名词。 80 | 81 | -------------------------------------------------------------------------------- /creating-a-great-web-team/bian-cheng-shi-yi-zhong-ji-neng.md: -------------------------------------------------------------------------------- 1 | # 编程是一种技能 2 | 3 | 价值:读者可以认识到编程也是一种技能,也可以通过科学的方法快速培养。 4 | 5 | -------------------------------------------------------------------------------- /creating-a-great-web-team/great-team-cannot-live-without-code-review.md: -------------------------------------------------------------------------------- 1 | # 没有 Code Review 就没有好团队 2 | 3 | 价值:让读者认识到 code review 的重要性。通过我们的 code review 实践更好地去做 code review。 4 | 5 | -------------------------------------------------------------------------------- /creating-a-great-web-team/product-released-email.md: -------------------------------------------------------------------------------- 1 | # 项目上线邮件 2 | 3 | 价值:让读者意识到项目上线邮件的重要性,以及如何写出言简意赅的邮件。 4 | 5 | -------------------------------------------------------------------------------- /creating-a-great-web-team/recruiting.md: -------------------------------------------------------------------------------- 1 | # 关于招聘 2 | 3 | 价值: 4 | 5 | 1. 让读者意识到招聘的重要性,我指的是真正的意识到。 6 | 2. 让读者 get 到一些分辨好程序员的一些 tips. 7 | 8 | -------------------------------------------------------------------------------- /personal-development/making-excellent-resume.md: -------------------------------------------------------------------------------- 1 | # 写一封彰显实力而不失优雅的简历 2 | 3 | ## 好简历提升获得好工作的概率 4 | 5 | 这是一个真实案例。 6 | 7 | 小 Y 是一名从业一年多的前端开发工程师,因为个人发展的关系,希望能加入到一个更大的开发团队。于是她写了一份简历投到招聘平台上。 8 | 9 | 然而不幸的是,简历如石沉大海,过了两周仍然没有人联系她。 10 | 11 | 后来在大鱼的指点下,她优化了一下简历,作了一些调整。重新投递后,第二天就接到了电话面试。 12 | 13 | 这次调整为什么这么有效?因为结构调整后,呈现了读者最关心的内容。 14 | 15 | ## 简历读者关心哪些东西? 16 | 17 | * 你是一个什么样的人,你与众不同的地方在哪里? 18 | * 为什么你能胜任这份工作? 19 | * 你是如何思考和解决问题的? 20 | * 你的成功项目有哪些?为什么成功,好在什么地方?为什么有价值, 解决了什么问题? 21 | 22 | 这些问题回答得越具体越充分,通过简历筛选的概率就越大。 23 | 24 | ## 重点内容 25 | 26 | ### 项目 27 | 28 | #### 什么是项目? 29 | 30 | 项目是最重要的事实证据,无论是筛选简历,还是面试,或是晋升评审,都是围绕项目进行沟通,所以描述好项目是简历中最重要的事情,没有之一。 31 | 32 | 项目可以是一个软件开发项目,如大促活动开发,也可以是一个概念的落地实践,比如在团队中推广某个技术框架, 或是推行一种管理方式。只要是有计划、有目标、有资源投入、有分阶段的过程的,都可以称为项目。 33 | 34 | #### 怎么描述一个项目? 35 | 36 | 描述清楚以下几点: 37 | 38 | 1. **为什么要做这个项目?** 39 | 40 | 交代一下项目背景,让读者能理解你要解决的问题,和你处于同一个上下文。方便对方更能理解你做的事情。 41 | 42 | 比如: 43 | 44 | * 故障频发,为了解决这个问题,你在团队中推行持续集成 45 | * 为了提高运营效率,要将一些运营动作在线化、产品化 46 | * 为了让大家的学习成长更有动力,你提出了一个学习奖励计划,设计了一套机制 47 | 48 | 2. **遇到了什么挑战? 是如何解决的?** 49 | 50 | 比如: 51 | 52 | * 单元测试乍看起来要花额外的经历去写和维护,看起来是降低了开发效率,受到了一些人的排斥。真实的情况是单元测试对效率和质量都有提升作用,尤其是架构设计的演进的必要条件。这件事需要布道,所以你先在核心系统上小范围使用,大家养成习惯之后就离不开了,然后就大范围推广。 53 | * 对接的运营动作比较多,所以你进行了思考和抽象,设计出一个专用的领域语言,做成了一个通用的系统,能够满足现在和将来的各种运营需求。 54 | * 一开始大家动力不足,于是使用一些游戏化的手段 55 | 56 | 57 | 3. **最终结果如何?** 58 | 59 | 你不能模糊地说「挺好的」,你需要用客观的事实(最好有数据)来表现结果。比如: 60 | 61 | * 单元测试覆盖率 50% 以上的项目,近半年内重大故障数量:0 (原先是多少来着?) 62 | * 每个月节约了 5 天运营投入,每年为公司节省了约 100 万开支 63 | * 团队成长显著,搭建了梯队,主动离职率为 0 64 | 65 | 归纳一下,其实你是在讲述一个 **故事**,一个真实的故事,并且这个故事的主人公就是你。 66 | 67 | #### 案例 68 | 69 | 这个故事是我以前真实的项目。 70 | 71 | > **Demo 中心项目** (2011年) 72 | > 73 | > 在日常工作中,我发现项目的沟通效率很低,设计文件(包括产品文档、交互稿和视觉稿)有变更时,是通过聊天工具同步给其他人的,这样容易只同步到部分项目成员。因此我做了一个简单的系统,把设计稿(demo)放到一个平台上进行管理,有变动的时候会自动同步给项目组的其他人。这个平台推出后获得了非常好的评价,大家再也不用把新的设计稿用阿里旺旺发给 15 个项目小伙伴,取而代之是一句「设计稿更新到 demo 中心了哦亲」。 74 | > 75 | > 这个平台后来整个阿里巴巴集团都在使用。 76 | 77 | 78 | ### 自我介绍 79 | 80 | 一个简历第二重要的是自我介绍。不像项目,自我介绍可以主观一些,怎样自由发挥都没事。比如:「 喜欢钓鱼,很有耐心,善于在过程中寻找乐趣」。 81 | 82 | 然而大部分简历的自我介绍都极度糟糕,他们看上去是这样的: 83 | 84 | > 接触及使用过的技术: 85 | > webpack、sass/less、es6、vue、react、flutter、数据可视化(Echarts、D3)、webgl 3D图形渲染、Node、源码解析(jquery、vue)、TypeScript、Angular2+ 86 | 87 | 这样的: 88 | 89 | > 本人拥有四年的_Web开发_及设计经验、精通 _HTML_、_HTML5_、_CSS_、_CSS3_、_JavaScript_、_Node_、_VUE_、_ES6_ 等前端开发技能,拥有开发 _PC_、H5 等多端项目经验;精通_Node_、 _Express_等_后端开发_技能,熟练使用Java、Spring、_MyBatis_、Mysql等_后端开发_技能;熟练使用Git、_SVN_等_代码管理工具_ 90 | 91 | 嗯,还不错。不过大部分情况下这些技术太普通了,没有什么值得放到自我介绍中炫耀的。 92 | 93 | 优秀的自我介绍是这样的: 94 | 95 | > 7年工作,不断在反思中进步,挫折中前行。从后端到前端,从小前端到大前端,从小白到资深,从独当一面到全栈的路上,不断前行。若是人生须有信仰,代码就是我的上帝。 96 | 97 | 是不是感觉这个人(声明: 这个人不是我)很栩栩如生? 你的自我介绍也要让人第一眼就知道你什么如何与众不同。 98 | 99 | ## 加分项 100 | 101 | * 在公司或者学校获得的,有代表性的奖项,比如 102 | * 公司的最佳新人奖 103 | * 在校期间获得奖学金 104 | * 层级获得计算机竞赛的奖(我相信如果有,你肯定不会忘记写) 105 | 106 | * 暗示你通过层层选拔之后脱颖而出的事情 107 | * 在大厂实习过 108 | * 获得某大厂的 offer 109 | * 担任公司技术委员会的评委 110 | 111 | ## 其他的小 tips 112 | 113 | * 不要用「我有很深的造指」这种既很浮夸又有错别字的话。 114 | * 不要假定读者知道一些「知名」的信息,比如「我曾经是 RubyConf 讲师」,你要解释一下 RubyConf 在行业内的影响力。当然如果你的对象是一家用 Ruby 的公司(基本可以断定是一家好公司),那就不必解释了。但是你也不知道哪天谁会看到你的简历呢? 115 | 116 | ## 总结 117 | 118 | 再也不要在简历中列你会什么、你做了什么了? 读者更关心你能不能胜任他的岗位。讲讲你的故事,让他感受到你能胜任。人都是故事的奴隶,是吧? 119 | -------------------------------------------------------------------------------- /personal-development/prefer-good-search-engine.md: -------------------------------------------------------------------------------- 1 | # Prefer Good Search Engine 2 | 3 | 价值: 读者认识到搜索引擎是程序员最重要的工具之一 4 | 5 | -------------------------------------------------------------------------------- /web-dev/kill-your-job.md: -------------------------------------------------------------------------------- 1 | # 追求:让自己失业 2 | 3 | 价值: 让读者能意识到「赋能」的重要性。 4 | 5 | -------------------------------------------------------------------------------- /web-dev/seek-answers-in-specifications.md: -------------------------------------------------------------------------------- 1 | # 在 Web 规范中寻找答案 2 | 3 | 价值:让读者认识到 Web 规范的重要性,平时多从规范中寻找答案,少看二手信息。 4 | 5 | -------------------------------------------------------------------------------- /web-dev/untitled.md: -------------------------------------------------------------------------------- 1 | # 关于认知 2 | 3 | 价值:认知 = 知晓原理,我们更应该关注技术背后的原理 4 | 5 | -------------------------------------------------------------------------------- /web-dev/web-dev-vs-frontend-dev.md: -------------------------------------------------------------------------------- 1 | # 「Web 开发」和「前端开发」 2 | 3 | **价值:** 4 | 5 | 解决「我是否应该学习后端」「我是否应该掌握全栈技术」这样的困惑。 6 | 7 | **材料** 8 | 9 | \*\*\*\* 10 | 11 | -------------------------------------------------------------------------------- /web-dev/you-need-casual-projects.md: -------------------------------------------------------------------------------- 1 | # 你需要有一些业余项目 2 | 3 | 价值:让读者知道业余项目的重要性,通过业余项目去实验新技术,通过生产项目去发挥更大的价值。 4 | 5 | --------------------------------------------------------------------------------