1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[docs add]程序员的技术成长战略

This commit is contained in:
Guide 2023-02-23 12:45:00 +08:00
parent cb97fada87
commit 12cd4a2be9
6 changed files with 238 additions and 27 deletions

View File

@ -5,6 +5,7 @@ export const highQualityTechnicalArticles = [
prefix: "advanced-programmer/",
collapsable: false,
children: [
"the-growth-strategy-of-the-technological-giant",
"seven-tips-for-becoming-an-advanced-programmer",
"20-bad-habits-of-bad-programmers",
],

View File

@ -207,7 +207,7 @@ InnoDB 的性能比 MyISAM 更强大,不管是在读写混合模式下还是
- InnoDB 支持行级别的锁粒度MyISAM 不支持,只支持表级别的锁粒度。
- MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
- MyISAM 不支持外键,而 InnoDB 支持。
- MyISAM 不支持 MVVC而 InnoDB 支持。
- MyISAM 不支持 MVCC而 InnoDB 支持。
- 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
- MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
- InnoDB 的性能比 MyISAM 更强大。

View File

@ -251,7 +251,7 @@ ORDER BY cust_name DESC;
**`having`**
- `having` 用于对汇总的 `group by` 结果进行过滤。
- `having` 必须要与 `group by` 连用。
- `having` 一般都是和 `group by` 连用。
- `where``having` 可以在相同的查询中。
**使用 WHERE 和 HAVING 过滤数据**
@ -266,8 +266,8 @@ HAVING COUNT(*) >= 1;
**`having` vs `where`**
- `where`:过滤过滤指定的行,后面不能加聚合函数(分组函数)。
- `having`:过滤分组,必须要与 `group by` 连用,不能单独使用。
- `where`:过滤过滤指定的行,后面不能加聚合函数(分组函数)。`where``group by` 前。
- `having`:过滤分组,一般都是和 `group by` 连用,不能单独使用。`having``group by` 之后。
## 子查询
@ -1202,4 +1202,9 @@ SHOW TRIGGERS;
```sql
DROP TRIGGER IF EXISTS trigger_insert_user;
```
```
## 文章推荐
- [后端程序员必备SQL高性能优化指南35+条优化建议立马GET!](https://mp.weixin.qq.com/s/I-ZT3zGTNBZ6egS7T09jyQ)
- [后端程序员必备书写高质量SQL的30条建议](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486461&idx=1&sn=60a22279196d084cc398936fe3b37772&chksm=cea24436f9d5cd20a4fa0e907590f3e700d7378b3f608d7b33bb52cfb96f503b7ccb65a1deed&token=1987003517&lang=zh_CN#rd)

View File

@ -0,0 +1,207 @@
---
title: 程序员的技术成长战略
category: 技术文章精选集
author: 波波微课
tag:
- 练级攻略
---
> **推荐语** 波波老师的一篇文章,写的非常好,不光是对技术成长有帮助,其他领域也是同样适用的!建议反复阅读,形成一套自己的技术成长策略。
>
> <br/>
>
> **原文地址:** https://mp.weixin.qq.com/s/YrN8T67s801-MRo01lCHXA
## 1. 前言
在波波的微信技术交流群里头,经常有学员问关于技术人该如何学习成长的问题,虽然是微信交流,但我依然可以感受到小伙伴们焦虑的心情。
**技术人为啥焦虑?** 恕我直言,说白了是胆识不足格局太小。胆就是胆量,焦虑的人一般对未来的不确定性怀有恐惧。识就是见识,焦虑的人一般看不清楚周围世界,也看不清自己和适合自己的道路。格局也称志向,容易焦虑的人通常视野窄志向小。如果从战略和管理的视角来看,就是对自己和周围世界的认知不足,没有一个清晰和长期的学习成长战略,也没有可执行的阶段性目标计划+严格的执行。
因为问此类问题的学员很多,让我感觉有点烦了,为了避免重复回答,所以我专门总结梳理了这篇长文,试图统一来回答这类问题。如果后面还有学员问类似问题,我会引导他们来读这篇文章,然后让他们用三个月、一年甚至更长的时间,去思考和回答这样一个问题: **你的技术成长战略究竟是什么?** 如果你想清楚了这个问题,有清晰和可落地的答案,那么恭喜你,你只需按部就班执行就好,根本无需焦虑,你实现自己的战略目标并做出成就只是一个时间问题;否则,你仍然需要通过不断磨炼+思考,务必去搞清楚这个人生的大问题!!!
下面我们来看一些行业技术大牛是怎么做的。
## 二. 跟技术大牛学成长战略
我们知道软件设计是有设计模式(Design Pattern)的,其实技术人的成长也是有成长模式(Growth Pattern)的。波波经常在 Linkedin 上看一些技术大牛的成长履历,探究其中的成长模式,从而启发制定自己的技术成长战略。
当然,很少有技术大牛会清晰地告诉你他们的技术成长战略,以及每一年的细分落地计划。但是,这并不妨碍我们通过他们的过往履历和产出成果,去溯源他们的技术成长战略。实际上, **越是牛逼的技术人,他们的技术成长战略和路径越是清晰,我们越容易从中探究出一些成功的模式。**
### 2.1 系统性能专家案例
国内的开发者大都热衷于系统性能优化,有些人甚至三句话离不开高性能/高并发,但真正能深入这个领域,做到专家级水平的却寥寥无几。
我这边要特别介绍的这个技术大牛叫 **Brendan Gregg** 他是系统性能领域经典书《System Performance: Enterprise and the Cloud》(中文版[《性能之巅:洞悉系统、企业和云计算》](https://www.amazon.cn/dp/B08GC261P9))的作者,也是著名的[性能分析利器火焰图(Flame Graph)](https://github.com/brendangregg/FlameGraph)的作者。
Brendan Gregg 之前是 Netflix 公司的高级性能架构师,在 Netflix 工作近 7 年。2022 年 4 月,他离开了 Netflix 去了 Intel担任院士职位。
![](https://img-blog.csdnimg.cn/img_convert/cdb11ce2f1c3a69fd19e922a7f5f59bf.png)
总体上,他已经在系统性能领域深耕超过 10 年,[Brendan Gregg 的过往履历](https://www.linkedin.com/in/brendangregg/)可以在 linkedin 上看到。在这 10 年间除了书籍以外Brendan Gregg 还产出了超过上百份和系统性能相关的技术文档,演讲视频/ppt还有各种工具软件相关内容都整整齐齐地分享在[他的技术博客](http://www.brendangregg.com/)上,可以说他是一个非常高产的技术大牛。
![性能工具](https://img-blog.csdnimg.cn/img_convert/fcd9e2d4dd351ac3ba1773fb1b50fe9e.webp?x-oss-process=image/format,png)
上图来自 Brendan Gregg 的新书《BPF Performance Tools: Linux System and Application Observability》。从这个图可以看出Brendan Gregg 对系统性能领域的掌握程度,已经深挖到了硬件、操作系统和应用的每一个角落,可以说是 360 度无死角整个计算机系统对他来说几乎都是透明的。波波认为Brendan Gregg 是名副其实的,世界级的,系统性能领域的大神级人物。
### 2.2 从开源到企业案例
我要分享的第二个技术大牛是 **Jay Kreps**,他是知名的开源消息中间件 Kafka 的创始人/架构师,也是 Confluent 公司的联合创始人和 CEOConfluent 公司是围绕 Kafka 开发企业级产品和服务的技术公司。
从[Jay Kreps 的 Linkedin 的履历](https://www.linkedin.com/in/jaykreps/)上我们可以看出Jay Kreps 之前在 Linkedin 工作了 7 年多(2007.6 ~ 2014. 9)从高级工程师、工程主管一直做到首席资深工程师。Kafka 大致是在 2010 年Jay Kreps 在 Linkedin 发起的一个项目,解决 Linkedin 内部的大数据采集、存储和消费问题。之后,他和他的团队一直专注 Kafka 的打磨,开源(2011 年初)和社区生态的建设。
到 2014 年底Kafka 在社区已经非常成功,有了一个比较大的用户群,于是 Jay Kreps 就和几个早期作者一起离开了 Linkedin成立了[Confluent 公司](https://tech.163.com/14/1107/18/AAFG92LD00094ODU.html),开始了 Kafka 和周边产品的企业化服务道路。今年(2020.4 月)Confluent 公司已经获得 E 轮 2.5 亿美金融资,公司估值达到 45 亿美金。从 Kafka 诞生到现在Jay Kreps 差不多在这个产品和公司上投入了整整 10 年。
![Confluent创始人三人组](https://img-blog.csdnimg.cn/img_convert/7945a18b8d135fa1bb0eb3f0350452dd.webp?x-oss-process=image/format,png)
上图是 Confluent 创始人三人组,一个非常有意思的组合,一个中国人(左),一个印度人(右),中间的 Jay Kreps 是美国人。
我之所以对 Kafka 和 Jay Kreps 的印象特别深刻,是因为在 2012 年下半年,我在携程框架部也是专门搞大数据采集的,我还开发过一套功能类似 Kafka 的 Log Collector + Agent 产品。我记得同时期有不止 4 个同类型的开源产品Facebook Scribe、Apache Chukwa、Apache Flume 和 Apache Kafka。现在回头看只有 Kafka 走到现在发展得最好,这个和创始人的专注和持续投入是分不开的,当然背后和几个创始人的技术大格局也是分不开的。
当年我对战略性思维几乎没有概念,还处在**什么技术都想学、认为各种项目做得越多越牛的阶段**。搞了半年的数据采集以后,我就掉头搞其它“更有趣的”项目去了(从这个事情的侧面,也可以看出我当年的技术格局是很小的)。中间我陆续关注过 Jay 的一些创业动向,但是没想到他能把 Confluent 公司发展到目前这个规模。现在回想其实在十年前Jay Kreps 对自己的技术成长就有比较明确的战略性思考也具有大的技术格局和成事的一些必要特质。Jay Kreps 和 Kafka 给我上了一堂生动的技术战略和实践课。
### 2.3 技术媒体大 V 案例
介绍到这里,有些同学可能会反驳说:波波你讲的这些大牛都是学历背景好,功底扎实起点高,所以他们才更能成功。其实不然,这里我再要介绍一位技术媒体界的大 V 叫 Brad Traversy大家可以看[他的 Linkedin 简历](https://www.linkedin.com/in/bradtraversy/),背景很一般,学历差不多是一个非正规的社区大学(相当于大专),没有正规大厂工作经历,有限几份工作一直是在做网站外包。
![](https://img-blog.csdnimg.cn/img_convert/30d6d67dc6dd5f9251f2f01af4de53fc.png)
但是Brad Traversy 目前是技术媒体领域的一个大 V当前[他在 Youtube 上的频道](https://www.youtube.com/c/TraversyMedia)有 138 万多的订阅量10 年累计输出 Web 开发和编程相关教学视频超过 800 个。Brad Traversy 也是 [Udemy](https://www.udemy.com/user/brad-traversy/) 上的一个成功讲师,目前已经在 Udemy 上累计输出课程 19 门,购课学生数量近 42 万。
![](https://img-blog.csdnimg.cn/img_convert/160b0bc4f689413757b9b5e2448f940b.png)
Brad Traversy 目前是自由职业者,他的 Youtube 广告+Udemy 课程的收入相当不错。
就是这样一位技术媒体大 V你很难想象在年轻的时候贴在他身上的标签是不良少年酗酒抽烟吸毒纹身进监狱。。。直
到结婚后的第一个孩子诞生,他才开始担起责任做出改变,然后凭借对技术的一腔热情,开始在 Youtube 平台上持续输出免费课程。从此他找到了适合自己的战略目标,然后人生开始发生各种积极的变化。。。如果大家对 Brad Traversy 的过往经历感兴趣,推荐观看他在 Youtube 上的自述视频[《My Struggles & Success》](https://www.youtube.com/watch?v=zA9krklwADI)。
![My Struggles & Success](https://img-blog.csdnimg.cn/img_convert/4de1f15cd0a047a3416f76501c26d288.webp?x-oss-process=image/format,png)
我粗略浏览了[Brad Traversy 在 Youtube 上的所有视频](https://www.youtube.com/c/TraversyMedia/videos)10 年总计输出 800+视频,平均每年 80+。第一个视频提交于 2010 年 8 月刚开始几年几乎没有订阅量2017 年 1 月订阅量才到 50k这中间差不多隔了 6 年。2017.10 月订阅量猛增到 200k2018 年 3 月订阅量到 300k。当前 2021.1 月,订阅量达到 138 万。可以认为从 2017 开始,也就是在积累了 6 7 年后,他的订阅量开始出现拐点。**如果把这些数据画出来,将会是一条非常漂亮的复利曲线**。
### 2.4 案例小结
Brendan GreggJay Kreps 和 Brad Traversy 三个人走的技术路线各不相同,但是他们的成功具有共性或者说模式:
**1、找到了适合自己的长期战略目标。**
- Brendan Gregg: 成为系统性能领域顶级专家
- Jay Kreps开创基于 Kafka 开源消息队列的企业服务公司,并将公司做到上市
- Brad Traversy: 成为技术媒体领域大 V 和课程讲师,并以此作为自己的职业
**2、专注深耕一个(或有限几个相关的)细分领域(Niche),保持定力,不随便切换领域。**
- Brendan Gregg系统性能领域
- Jay Kreps: 消息中间件/实时计算领域+创业
- Brad Traversy: 技术媒体/教学领域,方向 Web 开发 + 编程语言
**3、长期投入三人都持续投入了 10 年。**
**4、年度细分计划+持续可量化的价值产出(Persistent & Measurable Value Output)。**
- Brendan Gregg除公司日常工作产出以外每年有超过 10 份以上的技术文档和演讲视频产出,平均每年有 2.5 个开源工具产出。十年共产出书籍 2 本其中《System Performance》已经更新到第二版。
- Jay Kreps总体有开源产品+公司产出1 本书产出,每年有 Kafka 和周边产品发版若干。
- Brad Traversy: 每年有 Youtube 免费视频产出(平均每年 80++Udemy 收费视频课产出(平均每年 1.5 门)。
**5、以终为始是牛人和普通人的一大区别。**
普通人通常走一步算一步,很少长远规划。牛人通 常是先有远大目标,然后采用倒推法,将大目标细化到每年/月/周的详细落地计划。Brendan GreggJay Kreps 和 Brad Traversy 三人都是以终为始的典型。
![以终为始](https://img-blog.csdnimg.cn/img_convert/b83d495bd6b8765f127bb97e08e1544d.webp?x-oss-process=image/format,png)
上面总结了几位技术大牛的成长模式,其中一个重点就是:这些大牛的成长都是通过 **持续有价值产出(Persistent Valuable Output)** 来驱动的。持续产出为啥如此重要,这个还要从下面的学习金字塔说起。
## 三、学习金字塔和刻意训练
![学习金字塔](https://img-blog.csdnimg.cn/img_convert/41489858d0060f26e69c30bc964816bd.webp?x-oss-process=image/format,png)
学习金字塔是美国缅因州国家训练实验室的研究成果,它认为:
> 1. 我们平时上课听讲之后,学习内容平均留存率大致只有 5%左右;
> 2. 书本阅读的平均留存率大致只有 10%左右;
> 3. 学习配上视听效果的课程,平均留存率大致在 20%左右;
> 4. 老师实际动手做实验演示后的平均留存率大致在 30%左右;
> 5. 小组讨论(尤其是辩论后)的平均留存率可以达到 50%左右;
> 6. 在实践中实际应用所学之后,平均留存率可以达到 75%左右;
> 7. 在实践的基础上,再把所学梳理出来,转而再传授给他人后,平均留存率可以达到 90%左右。
上面列出的 7 种学习方法,前四种称为 **被动学习** ,后三种称为 **主动学习**
拿学游泳做个类比,被动学习相当于你看别人游泳,而主动学习则是你自己要下水去游。我们知道游泳或者跑步之类的运动是要燃烧身体卡路里的,这样才能达到锻炼身体和长肌肉的效果(肌肉是卡路里燃烧的结果)。如果你只是看别人游泳,自己不实际去游,是不会长肌肉的。同样的,主动学习也是要燃烧脑部卡路里的,这样才能达到训练大脑和长脑部“肌肉”的效果。
我们也知道,燃烧身体的卡路里,通常会让人感觉不舒适,如果燃烧身体卡路里会让人感觉舒适的话,估计这个世界上应该不会有胖子这类人。同样,燃烧脑部卡路里也会让人感觉不适、紧张、出汗或语无伦次,如果燃烧脑部卡路里会让人感觉舒适的话,估计这个世界上人人都很聪明,人人都能发挥最大潜能。当然,这些不舒适是短期的,长期会使你更健康和聪明。波波一直认为, **人与人之间的先天身体其实都差不多,但是后天身体素质和能力有差异,这些差异,很大程度是由后天对身体和大脑的训练质量、频度和强度所造成的。**
明白这个道理之后,心智成熟和自律的人就会对自己进行持续地 **刻意训练** 。这个刻意训练包括对身体的训练,比如波波现在每天坚持跑步 3km走 3km每天做 60 个仰卧起坐5 分钟平板撑等等,每天保持让身体燃烧一定量的卡路里。刻意训练也包括对大脑的训练,比如波波现在每天做项目写代码 coding(训练脑+手),平均每天在 B 站上输出十分钟免费视频(训练脑+口头表达),另外有定期总结输出公众号文章(训练脑+文字表达),还有每天打半小时左右的平衡球(下图)或古墓丽影游戏(训练小脑+手),每天保持让大脑燃烧一定量的卡路里,并保持一定强度(适度不适感)。
![平衡球游戏](https://img-blog.csdnimg.cn/img_convert/5806350b9831d3a502ec84d40f81018f.webp?x-oss-process=image/format,png)
关于刻意训练的专业原理和方法论,推荐看书籍《刻意练习》。
![刻意练习](https://img-blog.csdnimg.cn/img_convert/1707c3755515967caa138533eac3c53a.webp?x-oss-process=image/format,png)
注意,如果你平时从来不做举重锻炼的,那么某天突然做举重会很不适应甚至受伤。脑部训练也是一样的,如果你从来没有做过视频输出,那么刚开始做会很不适应,做出来的视频质量会很差。不过没有关系,任何训练都是一个循序渐进,不断强化的过程。等大脑相关区域的"肌肉"长出来以后,会逐步进入正循环,后面会越来越顺畅,相关"肌肉"会越来越发达。所以,和健身一样,健脑也不能遇到困难就放弃,需要循序渐进(Incremental)+持续地(Persistent)刻意训练。
理解了学习金字塔和刻意训练以后,现在再来看 Brendan GreggJay Kreps 和 Brad Traversy 这些大牛的做法,他们的学习成长都是建立在持续有价值产出的基础上的,这些产出都是刻意训练+燃烧脑部卡路里的成果。他们的产出要么是建立在实践基础上的产出,例如 Jay Kreps 的 Kafka 开源项目和 Confluent 公司要么是在实践的基础上再整理传授给其他人的产出例如Brendan Greeg 的技术演讲 ppt/视频,书籍,还有 Brad Traversy 的教学视频等等。换句话说,他们一直在学习金字塔的 5 7 层主动和高效地学习。并且,他们的学习产出还可以获得用户使用,有客户价值(Customer Value),有用户就有反馈和度量。记住,有反馈和度量的学习,也称闭环学习,它是能够不断改进提升的;反之,没有反馈和度量的学习,无法改进提升。
现在,你也应该明白,晒个书单秀个技能图谱很简单,读个书上个课也不难。但是要你给出 5 10 年的总体技术成长战略,再基于这个战略给出每年的细分落地计划(尤其是产出计划),然后再严格按计划执行,这的确是很难的事情。这需要大量的实践训练+深度思考,要燃烧大量的脑部卡路里!但这是上天设置的进化法则,成长为真正的技术大牛如同成长为一流的运动员,是需要通过燃烧与之相匹配量的卡路里来交换的。成长为真正的技术大牛,也是需要通过产出与之匹配的社会价值来交换的,只有这样社会才能正常进化。你推进了社会进化,社会才会回馈你。如果不是这样,社会就无法正常进化。
## 四、战略思维的诞生
![思考周期和机会点](https://img-blog.csdnimg.cn/img_convert/21f0ef179bea9aa15c1606bdf537f81d.webp?x-oss-process=image/format,png)
一般毕业生刚进入企业工作的时候,思考大都是以天/星期/月为单位的,基本上都是今天学个什么技术,明天学个什么语言,很少会去思考一年甚至更长的目标。这是个眼前漆黑看不到的懵懂时期,捕捉到机会点的能力和概率都非常小。
工作了三年以后,悟性好的人通常会以一年为思考周期,制定和实施一些年度计划。这个时期是相信天赋和比拼能力的阶段,可以捕捉到一些小机会。
工作了五年以后,一些悟性好的人会产生出一定的胆识和眼光,他们会以 3 5 年为周期来制定和实施计划,开始主动布局去捕捉一些中型机会点。
工作了十年以后,悟性高的人会看到模式和规则变化,例如看出行业发展模式,还有人才的成长模式等,于是开始诞生出战略性思维。然后他们会以 5 10 年为周期来制定和实施自己的战略计划开始主动布局去捕捉一些中大机会点。Brendan GreggJay Kreps 和 Brad Traversy 都是属于这个阶段的人。
当然还有很少一些更牛的时代精英,他们能够看透时代和人性,他们的思考是以一生甚至更长时间为单位的,这些超人不在本文讨论范围内。
## 五、建议
**1、以 5 10 年为周期去布局谋划你的战略。**
现在大学生毕业的年龄一般在 22 23 岁,那么在工作了十年后,也就是在你 32 33 岁的时候,你也差不多看了十年了,应该对自己和周围的世界(你的行业和领域)有一个比较深刻的领悟了。**如果你到这个年纪还懵懵懂懂,今天抓东明天抓西,那么只能说你的胆识格局是相当的低**。在当前 IT 行业竞争这么激烈的情况下,到 35 岁被下岗可能就在眼前了。
有了战略性思考,你应该以 5 10 年为周期去布局谋划你的战略。以 Brendan GreggJay Kreps 和 Brad Traversy 这些大牛为例,**人生若真的要干点成就出来,投入周期一般都要十年的**。从 33 岁开始,你大致有 3 个十年,因为到 60 岁以后,一般人都老眼昏花干不了大事了。如果你悟性差一点,到 40 岁才开始规划,那么你大致还有 2 个十年。如果你规划好了,这 2 3 个十年可以成就不小的事业。否则,你很可能一生都成就不了什么事业,或者一直在帮助别人成就别人的事业。
**2、专注自己的精力。**
考虑到人生能干事业的时间也就是 2 3 个十年,你会发现人生其实很短暂,这时候你会把精力都投入到实现你的十年战略上去,没有时间再浪费在比如网上的闲聊和扯皮争论上去。
**3、细分落地计划尤其是产出计划。**
有了十年战略方向,下一步是每年的细分落地计划,尤其是产出计划。这些计划主要应该工作在学习金字塔的 5/6/7 层。**产出应该是刻意训练+燃烧卡路里的结果,每天让身体和大脑都保持燃烧一定量的卡路里**。
**4、产出有价值的东西形成正反馈。**
产出应该有客户价值,自己能学习(自己成长进化),对别人还有用(推动社会成长进化),这样可以得到**用户回馈和度量**,形成一个闭环,可以持续改进和提升你的学习。
**5、少即是多。**
深耕一个(或有限几个相关的)领域。所有细分计划应该紧密围绕你的战略展开。克制内心欲望,不要贪多和分心,不要被喧嚣的世界所迷惑。
**6、战略方向+细分计划都要写下来,定期 review 优化。**
**7、要有定力持续努力。**
曲则全、枉则直,战略实现是不可能直线的。战略方向和细分计划通常要按需调整,尤其在早期,但是最终要收敛。如果老是变不收敛,就是缺乏战略定力,是个必须思考和解决的大问题。
别人的成长战略可以参考,但是不要刻意去模仿,你有你自己的颜色,**你应该成为独一无二的你**。
战略方向和细分计划明确了,接下来就是按部就班执行,十年如一日铁打不动。
**8、慢就是快。**
战略目标的实现也和种树一样是生长出来的,需要时间耐心栽培,记住**慢就是快。**焦虑纠结的时候,像念经一样默念王阳明《传习录》中的教诲:
> 立志用功,如种树然。方其根芽,犹未有干;及其有干,尚未有枝;枝而后叶,叶而后花实。初种根时,只管栽培灌溉。勿作枝想,勿作花想,勿作实想。悬想何益?但不忘栽培之功,怕没有枝叶花实?
>
> 译文:
>
> 实现战略目标,就像种树一样。刚开始只是一个小根芽,树干还没有长出来;树干长出来了,枝叶才能慢慢长出来;树枝长出来,然后才能开花和结果。刚开始种树的时候,只管栽培灌溉,别老是纠结枝什么时候长出来,花什么时候开,果实什么时候结出来。纠结有什么好处呢?只要你坚持投入栽培,还怕没有枝叶花实吗?
![悬想何益](https://img-blog.csdnimg.cn/img_convert/46cb8c4b3561f382bd5f333ceb5747b1.webp?x-oss-process=image/format,png)

View File

@ -11,6 +11,7 @@
## 练级攻略
- [程序员的技术成长战略](./advanced-programmer/the-growth-strategy-of-the-technological-giant.md)
- [给想成长为高级别开发同学的七条建议](./advanced-programmer/seven-tips-for-becoming-an-advanced-programmer.md)
- [糟糕程序员的 20 个坏习惯](./advanced-programmer/20-bad-habits-of-bad-programmers.md)

View File

@ -25,7 +25,7 @@ tag:
### 集中化的版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是集中化的版本控制系统Centralized Version Control Systems简称 CVCS应运而生。
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是集中化的版本控制系统Centralized Version Control Systems简称 CVCS应运而生。
集中化的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
@ -52,19 +52,19 @@ tag:
### Git 简史
Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。
Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。
### Git 与其他版本管理系统的主要区别
Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。
Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。
下面我们主要说一个关于 Git 与其他版本管理系统的主要差别:**对待数据的方式**。
**Git采用的是直接记录快照的方式而非差异比较。我后面会详细介绍这两种方式的差别。**
**Git 采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。**
大部分版本控制系统CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统**将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。**
具体原理如下图所示,理解起来其实很简单,每当我们提交更新一个文件之后,系统都会记录这个文件做了哪些更新,以增量符号Δ(Delta)表示。
具体原理如下图所示,理解起来其实很简单,每当我们提交更新一个文件之后,系统都会记录这个文件做了哪些更新,以增量符号 Δ(Delta)表示。
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3deltas.png)
@ -92,7 +92,6 @@ Git 有三种状态,你的文件可能处于其中之一:
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3areas.png)
**基本的 Git 工作流程如下:**
1. 在工作目录中修改文件。
@ -105,20 +104,21 @@ Git 有三种状态,你的文件可能处于其中之一:
有两种取得 Git 项目仓库的方法。
1. 在现有目录中初始化仓库: 进入项目目录运行 `git init` 命令,该命令将创建一个名为 `.git` 的子目录。
1. 在现有目录中初始化仓库: 进入项目目录运行 `git init` 命令,该命令将创建一个名为 `.git` 的子目录。
2. 从一个服务器克隆一个现有的 Git 仓库: `git clone [url]` 自定义本地仓库的名字: `git clone [url] directoryname`
### 记录每次更新到仓库
1. **检测当前文件状态** : `git status`
2. **提出更改(把它们添加到暂存区**`git add filename ` (针对特定文件)、`git add *`(所有文件)、`git add *.txt`(支持通配符,所有 .txt 文件)
2. **提出更改(把它们添加到暂存区**`git add filename` (针对特定文件)、`git add *`(所有文件)、`git add *.txt`(支持通配符,所有 .txt 文件)
3. **忽略文件**`.gitignore` 文件
4. **提交更新:** `git commit -m "代码提交信息"` (每次准备提交前,先用 `git status` 看下,是不是都已暂存起来了, 然后再运行提交命令 `git commit`
5. **跳过使用暂存区域更新的方式** : `git commit -a -m "代码提交信息"``git commit` 加上 `-a` 选项Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 `git add` 步骤。
6. **移除文件** `git rm filename` (从暂存区域移除,然后提交。)
6. **移除文件** `git rm filename` (从暂存区域移除,然后提交。)
7. **对文件重命名** `git mv README.md README`(这个命令相当于`mv README.md README``git rm README.md``git add README` 这三条命令的集合)
### 一个好的 Git 提交消息
一个好的 Git 提交消息如下:
标题行:用这一行来描述和解释你的这次提交
@ -131,8 +131,8 @@ Git 有三种状态,你的文件可能处于其中之一:
### 推送改动到远程仓库
- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:`git remote add origin <server>` ,比如我们要让本地的一个仓库和 Github 上创建的一个仓库关联可以这样`git remote add origin https://github.com/Snailclimb/test.git`
- 将这些改动提交到远端仓库:`git push origin master` (可以把 *master* 换成你想要推送的任何分支)
- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:`git remote add origin <server>` ,比如我们要让本地的一个仓库和 Github 上创建的一个仓库关联可以这样`git remote add origin https://github.com/Snailclimb/test.git`
- 将这些改动提交到远端仓库:`git push origin master` (可以把 _master_ 换成你想要推送的任何分支)
如此你就能够将你的改动推送到所添加的服务器上去了。
@ -180,10 +180,9 @@ git fetch origin
git reset --hard origin/master
```
### 分支
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,*master* 是“默认”的分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,_master_ 是“默认”的分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
我们通常在开发新功能、修复一个紧急 bug 等等时候会选择创建分支。单分支开发好还是多分支开发好,还是要看具体场景来说。
@ -201,7 +200,6 @@ git checkout test
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3切换分支.png)
你也可以直接这样创建分支并切换过去(上面两条命令的合写)
```shell
@ -232,17 +230,16 @@ git branch -d feature_x
git push origin
```
## 推荐
## 学习资料推荐
**在线演示学习工具:**
「补充,来自[issue729](https://github.com/Snailclimb/JavaGuide/issues/729)」Learn Git Branching https://oschina.gitee.io/learn-git-branching/ 。该网站可以方便的演示基本的git操作讲解得明明白白。每一个基本命令的作用和结果。
「补充,来自[issue729](https://github.com/Snailclimb/JavaGuide/issues/729)」Learn Git Branching https://oschina.gitee.io/learn-git-branching/ 。该网站可以方便的演示基本的 git 操作,讲解得明明白白。每一个基本命令的作用和结果。
**推荐阅读:**
- [Git - 简明指南](https://rogerdudler.github.io/git-guide/index.zh.html)
- [图解Git](https://marklodato.github.io/visual-git-guide/index-zh-cn.html)
- [猴子都能懂得Git入门](https://backlog.com/git-tutorial/cn/intro/intro1_1.html)
- https://git-scm.com/book/en/v2
- [Generating a new SSH key and adding it to the ssh-agent](https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
- [一个好的 Git 提交消息,出自 Linus 之手](https://github.com/torvalds/subsurface-for-dirk/blob/a48494d2fbed58c751e9b7e8fbff88582f9b2d02/README#L88)
- [Git 入门图文教程(1.5W 字 40 图) ](https://www.cnblogs.com/anding/p/16987769.html):超用心的一篇文章,内容全面且附带详细的图解,强烈推荐!
- [Git - 简明指南](https://rogerdudler.github.io/git-guide/index.zh.html):涵盖 Git 常见操作,非常清晰。
- [图解 Git](https://marklodato.github.io/visual-git-guide/index-zh-cn.html):图解 Git 中的最常用命令。如果你稍微理解 git 的工作原理,这篇文章能够让你理解的更透彻。
- [猴子都能懂得 Git 入门](https://backlog.com/git-tutorial/cn/intro/intro1_1.html) :有趣的讲解。
- [Pro Git book](https://git-scm.com/book/zh/v2) 国外的一本 Git 书籍,被翻译成多国语言,质量很高。