为什么程序员怕改需求?看完这些神解释我笑了

为什么程序员/设计师怕改需求?网上有类似的段子,比如:「杀一个程序员不需要用枪,改三次需求就可以了。

 

有网友在知乎上提问「如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?」。本文综合了 3 位网友的回复。

 

猫爱吃鱼不吃耗子(@GRB130427A)的回复:

 

你去饭店,坐下来。

“服务员,给我来份宫保鸡丁!”

“好嘞!”

——————这叫原始需求

 

大厨做到一半。

“服务员,菜里不要放肉。”

“不放肉怎么做啊?”

“不放肉就行了,其它按正常程序做,不就行了,难吗?”

“好的您稍等”

——————中途需求变更

 

厨房:

大厨:“你大爷,我肉都回锅了”

服务员:“顾客非要要求的嘛,你把肉挑出来不就行了吗”

大厨:“行你大爷”

然而还是一点点挑出来了

——————改动太大,部分重构

 

餐厅:

“服务员,菜里能给我加点腐竹吗?”

“行,这个应该简单。”

——————低估改动成本

 

厨房:

大厨:“你TMD,不知道腐竹得提前泡水?炒到一半才说?跟他说,想吃腐竹就多等半天”

服务员:“啊你怎么不早说?”

大厨:“早说你MLGB我怎么知道他要往宫保鸡丁里放腐竹”

然而还是去泡腐竹了

——————新需求引入了新研发成本

 

餐厅:

“服务员,还是把肉加回去吧”

“您不是刚说不要肉吗”

“现在又想要了”

“…好的您稍等”

——————某一功能点摇摆不定

 

厨房:

大厨:“日你啊,菜都炒过火了你让我放肉?还好肉我没扔”

服务员:“客户提的要求你日我干嘛?”

大厨:“你就不能拒绝他啊?啊?”

服务员:“人家是客户嘛。”

——————甲方是大爷

 

餐厅:

“服务员!服务员!”

“来了来了,你好?”

“怎么这么半天啊?”

“稍等我给您催催啊”

——————改动开始导致工期延误

 

厨房:

大厨:“催你M催,腐竹没泡好,我还得重新放油,他要想吃老的也行,没法保质保量”

——————开发者请求重新排期

 

餐厅:

服务员:“抱歉,加腐竹的话得多等半天,您别着急哈”

“我靠要等那么久?我现在就要吃,你们能快点吗?”

“行…您稍等”

——————甲方催活

 

厨房:

大厨:“我日他仙人板板,中途改需求又想按期交付,逗我玩呢?”

服务员:“那我问问,要不让他们换个菜?”

大厨:“再换我就死了”

——————开发者开始和中间人pk

 

餐厅:

“服务员,这样吧,腐竹不要了,换成蒜毫能快点吗?对了,顺便加点番茄酱”

——————因工期过长再次改动需求

 

厨房:

大厨:“我日了狗啊,你TM不知道蒜毫也得焯水啊?还有你让我怎么往热菜里放番茄酱啊??”

服务员:“焯水也比等腐竹强吧,番茄酱往里一倒不就行了吗?很难吗?”

大厨:“草。腐竹我还得接着泡,万一这孙子一会又想要了呢。”

——————频繁改动开始导致大量冗余

 

餐厅:

“服务员,菜里加茄丁了没有?我去其它饭店吃可都是有茄丁的”

“好好好您稍等您稍等”

——————奇葩需求

 

厨房:

大厨:“我去他二大爷他吃的是斯里兰卡三流技校炒的宫保鸡丁吗?宫保鸡丁里放茄丁??”

服务员:“茄丁抄好了扔里边不就行了吗?”

大厨:“那TM还能叫菜吗?哪个系的?”

服务员:“客户要,你就给炒了吧。”

大厨:“MB你顺道问问他腐竹还要不要,我这盆腐竹还占着地方呢不要我就扔了”

——————奇葩你也得做

 

餐厅:

“服务员,还要多久能好啊”

“很快,很快…”

“再给我来杯西瓜汁。”

“…好”

“我再等10分钟,还不好我就走了,反正还没给钱。”

“很快,很快…”

——————黑暗前的最后黎明

 

10分钟后

“咦,我上次吃的不是这个味啊?”

从厨房杀出来的大厨:“我TM就日了你的狗…”

——————最终决战

 

——————

你=客户

服务员=客户经理+产品经理

大厨=码农

请自行转换…

——————

注:以上场景已极度夸张,实际生产生活中码农和PM是和睦友好的相亲相爱的一家人

——————

注:对于做2C产品的公司,你=公司大boss

 

 

下面是 钟文 推荐了两张漫画,原作者@big fattty @依然远扬

 

为什么程序员怕改需求?看完这些神解释我笑了

为什么程序员怕改需求?看完这些神解释我笑了

 

吕小布007 推荐下面这张趣图:

 

为什么程序员怕改需求?看完这些神解释我笑了

转自:https://mp.weixin.qq.com/s/w5NFMLgkYnNgalJ1Xp3bhQ

学妹问我: 如何提高编程能力

来自公众号:编程指北
学妹问我: 如何提高编程能力
聊天截图
学妹问我: 如何提高编程能力
聊天截图

前言

开局两张图,剩下全靠吹了。

上面这两张图便是写这篇文章的原由。

对话框的另一边,是一位大二计算机科班在读的小姐姐,看似平静的文字背后透露着迷茫与困惑,还对未来的焦虑。

透过屏幕,似乎看到了大一时的自己,不会装环境、不知道怎么编译,报错也不会解决,更不知道除了计算水仙花数、打印乘法口诀表…还能写些什么。

感同身受让我觉得有必要认真的好好回答一下(其实是因为这是小姐姐问的😝,也算是对大一时的自己一个隔空对话。

做公众号短短这一个多月,我在后台看到过不少类似问题的,每次看到学弟学妹们这样认真又略带迷茫的提问,其实是比较有压力的。

怕自己不能够站在他们的境地去思考问题,搞成了「B」乎似的回答,也担心自己的回答不能帮到他们,甚至在某些方面对他们产生误导。

所以一般我都是选择回答比较政治正确的那种,比如:

“加油,你要多去实践,xxx”

“嗯嗯,你要多去看书,balabala”

“刚开始都是这样的,你多坚持一下呢,xxx”

怎么说呢,这都是正确的废话,谁都知道要多看书,要实践,要去动手写代码。

有时候想回答得更细致一些,但是迫于各种原因,也没时间去挨个的回复。

但这次学妹特地打了很长一段字,我看到了她想要快速适应计算机学习却又不得其法的迷茫,也许我的回答会对她有所帮助呢?

因此我让她描述得更加细致一点,也很好针对性的提出一些建议。

不过首先申明下,本文主要是以回答学妹的问题为主线,面向的对象是大一、大二以及自学还未找到合适的学习编程方法的同学。

如果你已经有了自己的一套方法论,或者说已经工作了,那本文对你几乎没有参考价值,建议直接拉到末尾点个赞~

可能有小伙伴没细看聊天截图的内容,我在这里再贴一次学妹的问题:

学妹问我: 如何提高编程能力

下面是我抽出来的一些问题:

1、只会像高中一样跟着课程学习

2、怎么可以脱离课本和教学视频自己编写一个小项目?

3、停于理论,不知道如何实战

4、就算跟着教程安装软件,搭配环境几乎每一步都会有这样那样的错误

5、知识遗忘得快,理论没有形成体系,自己计算机的学习只局限在刷了一些慕课上的题,做了学校要求的实验

6、学完一门课程不知道能干什么

7、畏难情绪严重

8、焦虑、担心找不到工作

首先,看似抽出了很多条的问题,但是我把所有问题都归为一个,那就是 「如何提高编程能力」

只要编程能力、实战能力提高,上面一长串的问题自然也就不成问题了,更不用担心找工作的问题。

所以今天就来聊聊如何提高编程能力这个话题。

要说提高,总得先明确下什么是 「编程能力」 吧~

到底什么是编程能力

经常能看到大V、前辈们说,你要多写,要多练,提高自己的“编程能力”,但是编程能力到底是什么呢?

在我看来啊,所谓的编程能力其实说到底就是用代码解决问题的能力,无论是 Leetcode 上的还是现实世界的问题。

能够从问题本身或是业务逻辑提炼出解决方案,并且用代码去实现,编程就是在干这样一件事:

现实世界的问题 -> 抽象出解决方案/建模 -> 计算机语言表达

可以看到,写代码只是最后一步,而我们常常说自己不会写,真的是不会写代码吗?

这让我想起了以前英语老师说的:

“很多同学说英语作文说写不了几句就写不下去了,但是真的是英语学得差吗?我看未必,大概让你用中文写,也写不上几句”

是啊,英语作文写得不好,很多同学下意识的觉得是自己英语本身没学好,确实有这个原因。

但是更本质的原因或许是你语言表达和组织能力的问题,也就是让你用母语写,也不一定能有条理的写上一段文字。

那回到编程这里,不会写代码,也许是你连解决问题的思路都没想明白,就是说你的脑海里没有形成「第一步该做什么,第二步该做什么」这样的流程。

这其实是最重要的,编码实现反而是相对简单的事情。

很多大厂,一般都是高级工程师或者架构师进行领域设计、架构设计,初级工程师进行编码实现各种接口。

说到这,我又想起了最近工作上的事情。

由于时间紧迫,我被 leader 安排去了支援隔壁部门开发,但是他们那里的很多业务背景我一点都不知道。

对方对接的人让我去模仿 xxx 模块写,我看了 xxx 模块两天,愣是没写出个啥来。

事后,我在想,为啥会这样呢?是我编程能力太差吗?

也许是吧,但是更重要的原因是,我不理解业务背景,所以我的脑海里没有要实现这个需求的流程图.

检查参数、鉴权、认证、签名…… 这些流程不清晰,表现出来的形式就是,我不知道代码到底该先调哪个接口,再做什么。

心中没思路,自然无从下手。

所以其实编程的核心就是,你需要在心中对整个实现流程有一个大致的思路,然后用代码去一步步的实现。

在实现过程中,你会遇到很多细节问题,比如数据结构的选择,用 set 还是 list,存储结构的选型,以及如何 bug free的实现。

更进一步,怎样写出高性能、易读、易维护、易扩展高质量的代码,当然这都属于编码能力了。

如何提高编程能力

嗯,我回过去看了自己上面的一翻分析之后,我觉得……分析了个寂寞,说的太尼玛抽象了,我 TM 就想知道到底怎么提高编程能力!

好,接下来我就具体一点,不搞这些虚头巴脑的东西了。

提高编程能力,我自己总结了以下几点:

  • 多实战,做项目,用需求倒逼输入
  • 善用工具,尤其是搜索引擎
  • 看优质资料,特别是经典的计算机书籍
  • 养成自学习惯,提高自学能力
  • 看一些小而美的源码

来,先上第一点,关于做项目,这也是学妹的痛,不知道如何去开始一个项目。

谈到这点,对不起,我又想讲自己的经历了,有点长。。。

一、实践

learning by doing

是的,我们都知道编程是一门实践的学科,不动手永远学不会,看懂了和学会了之间差了上万行代码。

或者说:看懂了 + 上万行代码 = 学会(此公式未经证明,纯碎自己拍脑袋想的

刚学完一门语言,想必大家都想做点有用的东西,而不是天天写练习题,但是呢,又不知道从何下手,尤其是 C 语言。

我大一上完 C 语言课,就处于这种状态,但是我隔壁一个室友就不一样的。

他在学习 C 语言的过程中,刚学到动态内存分配(malloc),就去摸索着写贪吃蛇、坦克大战,而且完成度都挺高的,那时候是我们眼里妥妥的大神。

但是大神和我上的课,学的东西都完全一样呀,况且都是上了大学才开始接触编程,为什么差别这么大呢?

以至于那时候,我和学妹一样,常常怀疑自己没有编程天赋,觉得别人天生就是这么强。

这种状态一直持续到大一下,那时候刚学完 Java,而 Java 也比 C 友好了不少,所以总想写点什么。

于是自己就选择写一个类似 QQ 的聊天工具,其实功能就很简陋,就是一个简单的 GUI + Socket 编程,然后在加上用户信息管理就完了。

但是,当我用这个简陋的软件,分别在室友和我的电脑上跑起来并且成功发送消息的那瞬间,我觉得我的编程世界被点亮了。

原来编程这么好玩,原来我也能做一些有趣的东西!似乎找到了一丝编程的感觉,但还说不上到底是什么感觉,毕竟这个程序总共也就几百行。

紧接着,趁热打铁,我又写了一个联机五子棋,实现上依然是 GUI + Socket 传输数据。

但是写这个又遇到了不同的问题,比如棋盘在我的实现里是一个 N*N 的数组,棋子是用对象表示,对象里有坐标、颜色这些属性。

当时我就疑惑了,当一方落子后,该怎么把棋子对象通过网络传输给对方呢,再从网络接收的数据恢复到对象?

起初自己的想法是手动的把对象转换成字符串,然后像聊天工具一样发送给对方,比如:

{x: 12, y: 13, color: black .......}

这种做法没问题,但是总感觉不够优雅完美,于是上网一番搜索之后发现,原来我想的这个就叫「序列化」和「反序列化」。

并且在 Java 里直接实现 Serializable接口就好了,甚至可以直接使用ObjectOutputStream类就能完成序列化和反序列化对象。

这些问题在现在看来,根本就不是问题,更像是“常识”。甚至序列化这块,还会选择一些兼容性更好、性能更高的协议,比如 Protobuf、Thrift、Avro 等等。

但是对大一时的我来说,在这个过程中不断的遇到问题并且去解决,就是实打实的编程能力上的提高啊。

在我解决掉一系列问题之后,顺利的和隔壁室友用自己写的联机五子棋对战了几局,这个五子棋还支持不少诸如悔棋、暂停、自动判断输赢等功能。

界面风格和下面这个很相似(这是网上搜的)

学妹问我: 如何提高编程能力
Java版五子棋

但是由于当时没有存 Github 的习惯,代码在换电脑之后没能留下来。

通过写这些项目,我像打通了任督二脉一样,不是学了什么厉害的算法、也不是高深的设计模式、更没有分布式这样高级的东西。

那是什么呢?

我感觉到编程就好像搭积木一样,基本的函数、库、组件就是一个个的积木块,写的代码就是胶水。

只要我们心中有设计图纸,那就能通过胶水把这些积木搭建成想象的模样,缺少什么积木块,用到的时候再去搜索就行了。

在程序的世界,只要你想,你就能。

这段时间大概是我编程能力提升最快的一个阶段之一。

关于这个五子棋,还有个小插曲:

我写的不是联机五子棋嘛,然后启动的时候输入对方的 IP 和 Port 就能连上对战。

后来,我找了一个在其它城市上大学的高中同学,让他和我一起玩五子棋,但是呢,我傻乎乎的让他用 ifconfig 查看自己 IP 后告诉我,然后我在这边连接。

那个 ip 呢,大概长得像 192.168.1.xxx,熟悉的同学都知道,这个就是局域网内使用的 IP 了,并非公网上的 IP。

局域网内的 IP 只能在内网才能使用,所以我用这个 IP 是永远连不上的他的电脑的。

但是那时候我才大一,没学过计网,根本不懂这里面的原理。

为啥我和室友能连上呢(因为在一个局域网)?为啥和其它学校的同学就不行?

别看现在这个东西在我看来是常识,但我那时候是一点计网知识都没,就是硬着头皮学的 Socket 编程,去理解 IP 和 Port。

那是怎么解决的呢?

当然是找谷歌呀!

在网上一番查询后,大概明白了,如果想让不同局域网内的主机进行 P2P 通信,需要一个公网中转服务器辅助进行 NAT 打洞。。。后来,我就又去尝试 NAT 打洞了,其中细节就不再描述了。

其实把我个人编程经历上写这么多,就是想展现我是如何一步步去实践的,遇到了什么问题,又是怎么解决的,把这个过程展现出来。

你看我没学任何计网知识,还不是通过边学边用,完成了网络相关的项目。

所以你离项目只差一个开始。

说到这里,不少同学又会说,我知道要多实践、多动手,道理我都懂。

可我还是不知道如何开始去写一个五子棋、贪吃蛇之类的东西。

好,那我就要问问你了

小北:为什么你学了 C 语言还是不会写贪吃蛇呢?

学妹:老师没教我贪吃蛇如何在 C 语言中表示,也没教我如何让画面动起来,更没教我如何绘制 GUI ,所以我不知道怎么做。

这应该是大多数同学最典型的问题吧?

那我们以贪吃蛇为例拆解一下,看看是如何从问题到代码的。

首先,贪吃蛇是一个个的节点组成的,节点肯定有横纵坐标吧?一个个的节点组成了一条蛇,那自然应该想到链表吧?

蛇还有什么属性?当前移动的方向

还要食物位置吧?那这些属性在 C 语言中用结构体表达出来就是这样:

typedef struct node{
  int x;
 int y;
 struct node* next;// 单向链表
} SnakeNode;

typedef struct snake {
 SnakeNode *pHead; // 蛇头
 SnakeNode *pFood; // 食物
 int direction;  // 方向  0-3 依次表示:上、下左、右
 ...
}

接下要考虑的就是如何去绘制蛇,这个简单呀,就把整个链表从头开始把每个节点打印出来。

每个节点可以是一个圆点,也可以是方形。

那如何让蛇动起来?所谓的动,其实就是不断的将蛇打印出来,然后又清除。

并且不断的根据移动方向更新蛇的位置,只要这个过程够快,快过人眼能够分辨的帧率,那看起来蛇就像是在连续的动一样。

然后这个过程你还要去考虑如何检测碰撞,如何判断吃到了食物,还要随机产生食物。。。这些东西首先你得想清楚逻辑,代码实现其实if、else 、for 就足够了。

做项目的过程总会遇到不会的东西,也会遇到问题。

但是要相信,所有的问题在你之前基本上都已经有人遇到过了,只需要把问题准确的描述出来,然后去搜索引擎上搜就肯定能找到解决的线索。

如果你要等学会所有东西,才去开始做项目,那估计等到本科毕业也没机会。

本科上的就那几门课,Java/C/C++、操作系统、计网、编译原理、离散、数据结构……

可能没有学校会单独开一门课教你 Java Web、Python 写爬虫等等。

学完这些理论课,等到毕业,你会发现,依然好像什么都做不了,所以说,要动手,趁早。

并且理论上,学完一门语言,掌握了数组、链表、 if、for、函数这些编程最基本的概念,就有能力去实现一些诸如贪吃蛇、五子棋、扫雷这样的小玩意了。

这种通过项目去学习,以解决问题为导向的学习才是更加精准和高效的。

课堂上的学习大多数是老师灌输知识、学生记住,然后考试就能拿高分。

实际上有多少知识能转化为解决问题的能力呢?

不好说。

还是那句话,编程就像搭积木,学完基础的,积木块都给你了。

你能搭出房子、车子、还是火箭这全靠自己。

二、善用工具、学会搜索

学会用工具,更要用好的工具。什么是好的工具?

诸如 VSCode,Github、Stackoverflow、Google、知乎、Jetbrains 全家桶都是不错的编程工具,有的提高生产力,有的能解决问题。

都 2020 年了,就不要在机房装着 VC6 写练习题了。

不要等到大一结束了,还没上过 Github,更不知 issue、pull request 为何物。

计算机专业的学生,如果还在用百度搜索技术问题,送给你一段陈皓(左耳朵耗子)前辈的话:

学妹问我: 如何提高编程能力
coolshell截图

当然,在没法使用谷歌的情况下,百度还是可以用的,但是这对计算机专业的同学,不应该是一个问题。

很多时候,你把遇到的问题准确的复制到 Google/Stackoverflow 搜索框,大概就能找到答案。

而百度会将你带向培训班的课堂,嘿嘿,刺激不。

3. 看优质资料

现在处于信息大爆炸的时代,互联网上充斥着各种博客、学习资源,这是对学习者最好的时代。但是资源太多,就存在一个选择的问题,在这里我给你几个建议:

  1. 把网盘里屯的那 500G 视频/资源 删掉,你永远不会去下载来看的

正所谓,收藏从未停止,学习从未开始,当你不再习惯的收藏资源了,你就成长了。最好掌握获取/搜索资源的方式,自己需要什么资源再去搜就完了。而不是让资源白白的占据你的网盘。

  1. 当需要学习某个东西的时候先去知乎/Google 搜索 「xx学习路线」

然后根据高赞/优质回答,选取大 V 们都提到的资源,这大概是这个领域比较经典的,然后去搜集资料,开始学习。

B站、mooc、网易公开课、Coursera等视频网站上有很多优质免费的课程

答应我,不要再被那些关注送 500 G 学习资源的骗了好吗?资源都在网上公开着,直接打开 B 站就能看,不香么?

学应用框架,官方文档是最适合入门的,并且很多都提供了「快速入门」的指引

比如 Vue、Hadoop、Requests 这些官网的指引都非常的清晰易懂,真的不要再去看七零八碎的博客,博客的定位应该是补充。

少看博客,多看书

很多博客其实就是博主自己读完书,然后复述一遍的笔记,你再去看他的博客那就是等于学二手知识,他的高度就决定了你的高度。

当然有些优秀的博主能够概况性的总结,或者把某些原理讲得特别清楚,这是值得看的。

总的来说,系统性的看书是你成长最快的方式。

四、自学

大学的学习,学的绝非是仅仅的知识,最应该学会的能力是「自学」。

等走上工作岗位的时候,你便会发现这个能力有多么重要。

初入职场,在公司,没人会像学校里的老师那样,手把手的教你。

就算有安排导师,也是扔给你一堆的文档和资料,自己去学习,然后开始上手实际项目。

这个过程大多会比较痛苦,至少我这几个月是这么过来的。

说到这,我突然想说下我认为的「自学的能力」,因为在程序员这个群体中,不管是科班学生还是野生程序员,自学都是必不可少的。

那「自学的能力」又到底是什么呢?

我个人体会有以下几点:

1. 明确你学习的目标,比如我要学 Java Web、IOS 开发、机器学习等等

2. 了解该领域包含了哪些子模块,比如 Java web 需要学 Java 语言基础、JVM、数据库、计算机基础等

3. 掌握这些子模块的学习顺序和依赖路径,也就是先学什么,再学什么

4. 搞清楚这个方向有哪些入门、进阶的学习资料

5. 按着学习路线,开始学习一个子模块

上面这个过程,不断的递归下去,直到拆分出一个比较小的学习目标。

比如我要学 「Java web」,那这里面可能包含了Java 基础、Netty、JVM、Spring、MySQL、Redis 等等。

那 Java 基础又可以进一步分为 基础语法、面向对象、异常、集合、IO、反射等。

分到这里,你就可以开始去找资料学习了啊。

比如先安装 JDK,然后写 Hello World,然后慢慢开始刷书或是刷视频……

五、看小而美的源码

这里我用了一个定语「小而美」,小是指代码量少,最好就几千行,这样我们能够充分把控,美则是指代码实现写得很优雅。

我们都知道提高审美能力很重要的一环就是多看美的东西,好的设计。

那写代码也是一样的,自己学完基本语法,写出来的代码大概停留跑起来的水平。

这时候去看看大佬写的代码,你绝对会惊呼 卧槽,还能这样?

这样的代码有哪些呢?

如果你是大一的同学,我推荐你去看看 Linux 内核中关于链表的实现,简直特么太妙了,平常我们定义链表不都是这样嘛

struct Node {
   int data;
   struct Nodenext;
}

但是这个存在的问题就是,每个想用链表存储的结构体,我们都得去写一遍,遍历、插入、删除的逻辑,显然太low了。

那 Linux kernel 中就用宏,在对用户自定义数据结构侵入性很小的情况下,实现了其它语言中模板的功能。

相信我,看完,你会学到很多骚操作的,后面找机会写一下这块。

又比如学完 C 语言,你会不会觉得 C 中的字符串有点不灵活,那推荐你去看看 Redis 中关于动态字符串的设计–SDS。

这些代码都不长,也不难理解,但是看完对于提升我们的编码能力是有很大帮助的,这就是小而美。

提倡看源码,不是让你直接上手就啃什么 Nginx、Sqlite、Redis的源码,这些都是几万级别的代码量,一般初学者

即使要啃,我给你说个好办法,这些东西目前来看,代码量都是几万几十万的级别,有点不友好,你可以去 github fork 下来。

然后回退到第一个 commit,从第一个 commit 开始看起,看到第一个完整的版本。

这个过程也是能学到不少东西的,看看罗马都是怎么建造成的。

解答问题

好了,BB了一大段假大空的东西,最后再回到学妹具体的问题上,挑几个来具体问题具体分析:

一、只会像高中一样跟着课程学习

说到底,还是填鸭式,没有形成自己的目标和学习路径。

如何破局?

最简单的方式,给自己定一个目标,或者我给你定几个,自己领一个:

  • 学习前端开发,目标 BAT
  • 学习 Java 后端开发,目标 BAT
  • 做 Linux CPP后台开发,目标 BAT
  • 保研/考研,目标 985 或 C9
  • 算法岗….不建议,太卷了
  • 大数据开发、数据分析等等

如果你做技术岗,上面这几个基本覆盖了应届生找工作的主要岗位,你选一个自己相对喜欢一点的。

至于如何去达到目标?

当然是分解,然后去找 Google 呀,去看看 BAT 这些岗位需要点亮哪些技能,怎么学才能达到。

记住,目标、目标、目标!!!

没有目标,你的生活就会是得过且过,满足于上课、做作业、考试、绩点这样的循环。

到了毕业找工作,你会发现面试官好像都不怎么关注你的绩点有多高,他们更关注你的基础知识和解决问题的能力。

解决问题的能力怎么体现?

可以是刷题或者是让你讲你参与的项目,以及在这个项目中你扮演的角色和遇到了什么题,又是怎么解决的。

我们会发现,那些优秀的人,无一不是有着清晰的目标,从现在开始给自己定一个目标吧!

二、怎么可以脱离课本和教学视频自己编写一个小项目?

初学者跟着视频做是很有帮助的。

先跟着课本或者视频完成一个项目,记住不是看视频里的老师完成,而是你自己要跟着完整的敲一遍!

第二步,不看视频,根据自己脑海中的流程、思路来逐渐编码,明确先做什么,再做什么。

第三步,改造,或者基于视频里的做一个类似但不同的项目,比如视频里写的商城,那你可以自己做个论坛,视频里是贪吃蛇,你可以自己做个坦克大战,诸如此类。

其实这就是学自行车嘛,先用借助辅助轮或者别人扶着练习,然后慢慢的下掉辅助轮,自己骑。

千万不要没学会走,就想跑了,这样会摔得很惨。

三、就算跟着教程安装软件,搭配环境几乎每一步都会有这样那样的错误

这个问题,百分之 99% 的同学肯定都遇到过,甚至现在,我安装一些新环境的时候也会有各种问题。

想起刚学 Java 的时候需要去配置 Path、ClassPath、环境变量这些,但是第一次接触根本不知道配置这些的作用,也不知道他们的原理。

就跟着博客教程一步步执行,但是经常就会发生,明明都照着来了,还是跑不通。

那这个时候怎么办呢?

第一办法是重新搜索尝试不同的教程,这个其实是换汤不换药,能不能配通还是看运气

第二个办法就是去搜为什么要这样配?

了解之后,你就明白 Path 就是指定了我们平时在终端使用命令的搜索路径,ClassPath 则是让 Java 执行环境找到指定的 Java 程序对应的 Class 文件以及程序中引用的其他 Class 文件。

当你去了解这些东西之后,再去看博客的配置步骤就不再是懵的了。

在不了解背景的情况下,我们只能根据别人的指令一步步走,害怕和被人有一丝的不一样,而导致最后配置失败。

但是当你了解了原理之后,这些博客就只是参考了,你甚至还可以考虑到你和博主的某些环境是不是有差异,这些差异会对应到步骤中哪里应该采用不同的配置。

这个其实我体会特别深,在我第一次用到 CMake 的时候,起初,我是去抄别人的 CMakeList.txt 文件。

但是当我需要增加编译依赖或者其它定制化的时候,我就懵逼了。

include_directories、include_directories、target_link_libraries 这些指令,不知道如何去组合达到自己想要的目的。

那我当时是去找来了 CMake 的教程,浏览一遍后,我便懂了 CMake 构建的原理,以及各个指令的作用。

这时候,我便有能力基于别人的 CMakeList.txt 去定制化。

这就是我个人认为「搭配环境几乎每一步都会有这样那样的错误」的内在原因和解决办法了。

一句话,你是否清楚你所看博客做的每一步操作是在干什么,如果不明白。

只是复制别人的命令,那出错了,肯定会懵逼的。

四、 知识遗忘得快,理论没有形成体系

不知道学妹这里说的遗忘得快的知识是指什么?

我说一下我的看法吧,我在不同文章中都反复提到了,学习新知识要学会抓主线,把零碎的、非本质的东西浏览一遍就行,用到的时候知道去哪找,这就够了。

我在万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线中也提到过各个学科的主线是什么,这里再啰嗦一遍,比如计网,你说你把 CRC(循环冗余校验码)的计算方式忘了,这就是遗忘吗?

对不起,我也记不住,也完全没有必要去记。

计算机网络的主线是「两台主机之间的数据包是如何通过网络传输给对方的」,其它的,像 UDP 的包头的构成呀,SMTP 使用的端口号呀 之类的问题,看一遍,有个大体印象就行了。

但是你得知道 UDP 包头里有源端口和目的端口以及数据包长度,为什么呢?

因为这个是靠理解,反推出来的,首先 UDP 是传输层协议,传输层的目的是区分同一主机上的不同进程,那么一定是需要一个标识的,这就是端口号。至于它们是怎么排列的,这丝毫不是关键。

上面这段话,抛砖引玉的聊了下我认为什么知识是可以遗忘,什么是不可以遗忘的。

那不能遗忘的知识也遗忘了怎么办呢?

多看。多去思考这样设计背后的原理,多问自己「Why」。

至于理论没有形成体系,其实我也存在这个问题。

但是我想的是,量变引起质变,你先积累足够的各个领域的知识,总会有打通任督二脉的那一天。

才开始学,怎么可能有完整的知识体系呢,至少到了大三、大四再来考虑知识体系这个问题。

五、畏难情绪严重,担心找不到工作

畏难这个事,老实说,人人都会有,我也不例外。

不要想着去克服它,畏难其实和喜欢舒适区差不多,这大概是天性吧。

除了天性使然,还有一个原因是想得太多,做得太少,还没开始做呢,就去想各种后果了,进而产生一系列奇奇怪怪的想法,自己吓自己。

那克服畏难情绪最简单方法就是行动,立刻行动起来,去分析一下,要做成这件事,需要哪些资源、前置条件等等

行动是缓解焦虑的最好方式,这真的不是鸡汤。

至于担心找不到工作,这完全没啥好焦虑的呀,你按照上面说的去制定目标,学习,找工作就是一件水到渠成的事。

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?
中国程序员数量有多少,一直是一个谜。

 

1

中国有多少程序员?

这两天在知乎上闲逛,看到这样一个问题比较感兴趣,我们来一起研究下。

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?

 

题主的问题是:程序员是高薪行业,这些年吸引了很多小伙伴包括计算机行业,或者去培训班毕业走向编程。

通过他查询资料预估出中国程序员至少5000万?于是他问程序员的数量是否已经饱和或者过剩了?

首先他这个问题的前半段是正确的,因为程序员属于高薪行业,这些年确实吸引了很多人走进这个领域。

别的不说,我大学并不是从事计算机这个领域的,自己在数学系毕业后通过培训走进了程序员这个行业。

从事程序员之后,直接或者间接影响了至少20位以上的朋友,走进这个行业;同时我身边也有很多朋友,本来不是这个领域通过培训也做了程序员。

所以从过去几年的情况来讲,真的可以说是:365行行行转程序员,程序员的数量确实是爆发性的增长。

但就是这样,中国的程序员真的就有5000万吗?

 

2

 

到底有多少程序员?

中国程序员数量有多少,一直是一个谜。

在网络上有各种各样的统计版本,有的说程序员超过了5000万,有的说是500万,还有的朋友说真正写代码的人数不超过50万。

但至少可以肯定的是没有5000万,刚在CSDN的官网上看到他们的注册用户是3100万,这里还包含了很多僵尸用户和其他行业。

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?

我们下来看中国另外一个程序员社区博客园,博客园是程序员写博客的一个社区,这里面的数据可能相对CSDN来讲更精准一些。

刚好2020年8月36 氪报道了博客园的一篇文章,在这篇文中中提到博客园母亲的活跃用户大概不到300万。

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?

博客园的数据相对更垂直和精准一些,如果按照30%是学生,60%是开发人员来计算的话,大概有200万左右真正的一线开发人员。

当然并不是所有的程序员都注册了博客园,但也肯定也有一部分非程序员注册了博客园,所以综合相互抵消后,200万左右一线开发人员相对比较客观。

也就是说中国目前有 200 万左右在一线Coding的程序员。

 

 

3

 

大厂都招聘了多少人?

我们再来看一下,中国市值最高的10大互联网公司,有多个程序员员工?在网上找了目前国内前10大互联网公司排名。

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?

根据网上公开数据查询得出:
阿里巴巴 4万+ 程序员,腾讯 3万+,美团 1万+,京东 1.8万+,拼多多 2000+,贝壳 3000+,小米6000+,网易 1万 +,好未来没有查到,百度2w+。
数据来自网路并不准确,有知情的朋友欢迎提供数据,给我留言
粗略算了一下大概十几万,但实际上这里的研发人员包含了测试、运维和产品经理等岗位。
但这里没有包含一些互联网或者科技大厂,比如华为、中兴,比如字节跳动、蚂蚁金服和滴滴打车等。
可以得出一个这样的结论,TOP 10 公司可以占据中国研发人数的5%左右,只要可以去TOP10公司基本上走进了程序员的前5%。

4

 

是否饱和

知乎上这个问题的核心是,如今程序员是否真正已经饱和?

我们在拉勾网上查询相关岗位,上面提到的大厂几乎都在招聘,并且招聘的数量并不少?

并且在这次疫情的冲击下,这些大厂的裁员信息并不多,反而有的公司(比如字节跳动、华为等)仍然在大量招聘。

可以说明一个问题:高级程序员的数量仍然非常的紧缺。

但是同样面临着一个问题是,现在很多刚毕业或者刚培训出来的程序员,发现工作并不是那么的好找?

可以再次说明一个问题:初级程序员竞争比较激烈,也就说刚入门的程序比较多,导致竞争压力比较大。

综合来看的话,就是初级过剩,高级紧缺。

 

 

5

 

还是朝阳行业吗?

很多想进入互联网行业的新人,都有这样一个疑问,程序员现在还是朝阳行业吗,会不会过上几年就歇菜了。

可以肯定的说,互联网现在仍然是朝阳行业,并且未来10年甚至50年仍然都是。

知乎有一个朋友,在网上搜索了一个问题是:计算机行业是否包含,结果发现每年都有类似的文章说饱和了。

我估计过10年之后,这样的文章仍然每年都有。

美国自从1946年2月14日发明第一台计算机以来,已经走过了近74年,互联网仍然在猛烈的发展。

中国互联网满打满算也不到30年,这个时候不好好往前发展,这才哪到哪呀,紧张个毛钱

前20年,现在,以及未来的几十年,仍然是互联网大发展的时期,如果真的有志从事这个行业,只需要加速往前冲…

中国程序员超5000万?北上广等一线城市IT岗位已开始饱和过剩?

 

声明:转载本公号原创文章,请于原文发布48小时后经授权转载,谢谢!

 

作者简介纯洁的微笑,一个有故事的程序员👈详细了解曾在互联网金融,第三方支付公司工作,现为一名自由职业者,和你一起用技术的角度去看这个世界。我的微信号puresmilea,欢迎大家找我聊天,记录你我的故事。
< END >

转自:https://mp.weixin.qq.com/s/aiyHX0zjSo7ZQiShFImFCg

程序员如何挣外快?

程序员如何挣外快?
作者 | Simon Holdorf
译者 | Malefikus
策划 | 褚杏娟

成为一名程序员是一件很棒的事。不仅是因为在大多数时候你的工作都很有趣,也因为程序员总是有大量的收入很好的工作机会。

但是有时候,你可能就是格外想要一些额外的资金在身边。比如当你仍然在大学中时,在你想要开始为自己工作而不是为他人时,当你有了一个孩子并且想花更多的时间和他们在一起时,当你就是需要再去搞点现金时,亦或者只是为了享受乐趣而去做时。

好的地方在于:作为一名程序员,你具有一切需要具备的东西来提升你的现金流。所有真正需要的就只有你的大脑和笔记本电脑。感兴趣么?来看看下面哪个策略最适合你吧。

成为一名自由职业者

从事自由职业可以是一件很棒的事。没有(真实的)老板,还有大量的项目可供选择,作为专家的每日收入也很高,还可以享受要多少有多少的假期…… 当然,还有其他一些好处没有列出。

当然了,这也需要大量的训练和努力去寻找客户和项目。对我来说最大的好处在于,你可以伴随着你的永久工作来开展你的副业,比如在晚上或者在周末进行。

类似 Upwork 或者 Fiverr 这样的平台似乎提供了大量的机会,尤其是那些可以当作副业来做的事,当然竞争也是存在的。

不过这里的收益也相当低,除非你想先试试水或者可以接受比较少的额外收入,否则我并不推荐。

一个更好的策略是在你的 LinkedIn 简历上下功夫,联系招聘人员和你既往的客户,参加会议和聚会,并寻找可以匹配远程工作人员和公司的平台。

参加编程比赛

这真的是一件可行的事,确实有专门的平台组织编程比赛并提供奖金。

其中一个最大的平台是 Topcoder,这里有超过一百万的成员和大量的比赛。他们聚焦在三个主要的领域:设计,数据科学 和 开发。

你有机会参与由超过 2000 家公司发起的项目,或者是独立的有对手的比赛。这确实是一件非常有趣的事,同时也可以快速学习。

如果你热衷于挑战,那么这将非常适合你。然而,作为比赛来说,你无法获得一个稳定的收入,所以这个选择的优先级也较低。

开始写作

在我看来,写作仍然是其中一个可以获得广泛观众的好方法。也确实有大量的机会可以让你通过写作来赚钱:

  • 你可以创建自己的博客并通过广告收入获利。

  • 你可以写书或者电子书并通过线上销售。

  • 你可以在 Medium 这样的平台上写作并参与他们的合作计划(Partnership Programs)。

  • 你也可以为已经存在的网站(如 CSS-Tricks)撰稿,如果文章被接受就会获得固定金额的收入。

尝试事物并观察人们对你所写内容的反应是没有错的。

然而,你需要考虑的是,应该选择自己感兴趣的方向从而可以保持自身的积极性,同时需要保持写作的一致性(需要时间来被承认),并且需要去不断提高你的写作技能进而写出高质量的文章(读者会因此感谢你的,因为低质量的内容太多了……)。

录制和销售在线课程

在我看来,能够在线教人知识是过去十年出现的最好的事情之一,而且应该还能至少再持续十年。

这对于学生和老师来说都有很大的益处。学生可以有很多可供选择的课程并且按照他们自己的时间来学习。老师所讲的内容则可以造福成千上万的人。

如果你对于编程很有经验,且具备像 JavaScript 或 Python 这类语言(或其他受欢迎的语言或框架)或甚至小众渗透测试的专业知识,同时很享受教人知识的过程,那么创建在线课程就可以成为你的选择。

有很多平台可以发布你的课程。举例来说,Udemy 每个月有差不多 7500 万的访问者而且任何人都可以加入。

程序员如何挣外快?Udemy 流量一览

有的平台像 Frontend Masters 或者 Pluralsight 这种是邀请制的,但是如果你有一定的声誉和一个好的人际关系网络,又何尝不可呢?

然而,在录制你的课程时有一些事情也需要考虑:

  • 你需要为好的设备投资:好的麦克风和摄像头是必须的!

  • 高质量的内容才是王道。这个领域的竞争在持续增加,所以你需要说服人们你可以教他们更有价值的东西。

  • 练习大声和清晰地说话。

  • 务必重新审视你的录音内容。

  • 创建额外的辅助材料,比如 GitHub 工程,汇报,代码示例等。

虽然一个课程被录制并且人们开始购买这件事很吸引人,同时还能给你带来大量的收入,但这仍然只在一定程度上是正确的。最好的老师会不断地更新他们的课程,因为技术总是在进步!

做一名播客

很多人不喜欢出现在摄像机前,但他们仍然是一个领域的专家并且乐于和他人分享他们的知识。

广播无疑是一个很好的媒介去做这件事。尽管播客已经存在了一段时间,但是在过去的四五年里他们仍然收获了大量的观众,数百万人每天在上班的路上或睡觉前都在聆听。

如今,很多播客都是免费的,所以金钱收入只不过是一个副产品。大量播客节目都有赞助商付给他们服务或者金钱。很多播客都在 Patreon 上,这是一个人们可以按月付费去支持他们的工作并解锁一些额外内容的平台。

为了成为一名成功的播客,你应该练习怎样很好地表达自己,投资好的设备(麦克风),最重要的是:不断努力去更新。

一个很正常的现象是,人们通常需要每周创作并持续一到两年后才能取得真正的成就,即大量的听众。

所以,在做播客之前,请先确保你是真的很有热情。

    结论    

关于以上的每一个选择,我最后想说的是:

坚持就是王道。

无论你从何处着手——请不断地追求并坚持。绝大多是事情不可能立即就有成效,你需要付出时间和精力努力工作。有 99% 的人都太早放弃了,希望你可以成为那 1% 的成功人士。

延伸阅读

https://medium.com/better-programming/how-to-make-extra-money-as-a-programmer-144d76b76ffd

转自:https://mp.weixin.qq.com/s/nXLheyquIq8YpQ_fdb1y5A

全国程序员工资最新统计来了,平均 14,542 元

导读:本文根据招聘网站数据,统计程序员就业信息。2020 年 5 月全国程序员平均工资 14542 元,工资中位数 12500 元。

相比于去年,普通软件工程师这一年的工资增长了 1000 元,你的工资增加了么?
01 平均工资
2020 年 5 月全国招收程序员 312761 人。2020 年 5 月全国程序员平均工资 14542 元,工资中位数 12500 元,其中 95% 的人的工资介于 5250 元到 35000 元。
全国程序员工资最新统计来了,平均 14,542 元
02 一线城市工资
全国程序员工资最新统计来了,平均 14,542 元
2020 年 5 月北京招收软件工程师 24478 人。2019 年 5 月北京软件工程师平均工资 19273 元,工资中位数 17500 元,其中 95%的人的工资介于 7000 元到 45000 元。
2020 年 5 月上海招收软件工程师 51403 人。2019 年 5 月上海软件工程师平均工资 17477 元,工资中位数 15500 元,其中 95%的人的工资介于 7000 元到 40000 元。
2020 年 5 月深圳招收软件工程师 44509 人。2019 年 5 月深圳软件工程师平均工资 17052 元,工资中位数 15000 元,其中 95%的人的工资介于 7000 元到 37500 元。
2020 年 5 月杭州招收软件工程师 20042 人。2019 年 5 月杭州软件工程师平均工资 15089 元,工资中位数 12500 元,其中 95%的人的工资介于 3750 元到 37500 元。
2020 年 5 月广州招收软件工程师 32997 人。2019 年 5 月广州软件工程师平均工资 14238 元,工资中位数 12500 元,其中 95%的人的工资介于 5500 元到 30000 元。
03 主要城市工资
全国程序员工资最新统计来了,平均 14,542 元
04 职能与工资
全国程序员工资最新统计来了,平均 14,542 元
普通软件工程师这一年的工资增长了 1000 元,你的工资增加了么?
05 数据异常检查
首先我们会对数据异常进行检查,方法就是用各种指标监视数据异常。比如,我们会把工资变化大于 1000 的城市找出来。
如下图:
全国程序员工资最新统计来了,平均 14,542 元
这里,我们发现济南有一家公司校招 300 人,而且重复发了 5 次。这样就严重的降低了济南的平均工资。
于是,我们增加了一条新的规则,所有的应届生都删除。这样可以保证数据的稳定。
代码:
https://github.com/juwikuang/china_job_survey
版权声明:本文为 CSDN 博主「有数可据」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/juwikuang/article/details/105875849