欢迎来到千里码话题版块。

我们会定期挑选程序员息息相关的话题让大家讨论:

1. 每个话题持续一周,话题结束后仍然可以继续讨论。点击查看所有话题

2. 用户投票的权重为自己当前的分数,权重会随着你的分数变化而变化。不能给自己的回复投票。

3. 关于话题的吐槽和建议,请移步话题吐槽专用讨论

4. 如果你有话题想拿出来给大家讨论,话题投稿请移步话题投稿专用讨论

5. 仅支持Markdown,不会Markdown请参考题目Markdown

更多请阅读帮助中心

奖励规则:

话题结束时发表得分最高的回复会以"优胜"的标记标出。发表该回复的用户会获得ikbc Poker3以及意见领袖徽章。

如果能重学一次编程,会怎么规划自己的学习路径? 已经结束

大部分人重新回顾自己的学习编程的经历,往往会发现自己走了很多弯路,踩了很多坑。或许是一本久负盛名的书,花了很多精力看完之后却发现名不符实;或许是追求一些时髦的新技术,却发现竹篮打水,镜花水月;或许是听信了一些一面之词,因傲慢和偏见而固步自封;或许是对某些看上去艰深晦涩的领域心存畏惧,导致无法理解很多问题的本质……

所以本期话题的主题为如果能重回初学编程的时候,会怎么规划自己的学习路径,希望大家分享自己的故事。


为了避免大家出于个人的认同而不是对于内容本身的认同来点赞,所以从本期开始,所有参加话题的参与人的身份将会匿名,直到话题结束后才公开显示ID。请大家也遵守该项规则,不要猜测回复者的身份或是主动暴露自己的身份。

奥利奥   2016-09-11 23:21:04 提问 topic
8 个回答
优胜
Sayalic , 晚饭还没吃完,他们就知道时刻到了。他其实可以说:“我必须去寻找公主。”但是他没有必要这么做。他给了她最后的一吻,然后就背起行囊,走出门去。
28 人赞同, 0 人反对

先说说我自己的踩过坑的吧:

坑1 - 选书

大学的时候,军训结束后开始正式上课了。终于要学编程了,好激动!我也要像传说中的黑客,噼里啪啦敲一顿键盘,世界便尽在掌控之中……上课的前一天,领到了崭新的编程教材,我兴奋地睡不着觉,熬夜用手机的补光灯照着看……

命运给我开了个玩笑,这本书的作者叫谭浩强,据说,这书里面每一页都有错误。等我发现的时候,我只好重新学了一次C语言……因为我对于C语言的理解几乎都是错误的……

顺便一提,我重学选用的书是:C语言程序设计:现代方法

经过C语言的教训,我发现看一本烂书不如不看。这时来到了大二,开始学习Java了。这次我再也不信国内的那些大学教材了,豆瓣上搜了下,发现评分最高的是Java编程思想,评论都说好。果断买买买,奉为圭臬,每日研读。

这次我的Java确实学的不错了,期末Java大作业的时候,大部分人还在懵逼的时候我脑子里面已经知道该怎么实现了。最后大家发现我很靠谱,于是整个小组把写代码的任务都交给我了(大作业除了写代码还有写文档之类的杂活),我也不负众望,一个通宵搞定,感觉自己强无敌。

然而等我到了工作中的时候发现了两个问题:

第一,Java编程思想成书于2006年,主要讲的还是Java SE 6,然而等我工作的时候,Java SE 8已经推出,并以疾风骤雨之势成为了大部分的公司线上环境。而Java SE 8的引入的诸多新特性以及SE 6和7里面的废弃不用的类和方法,也需要花时间重新学习和整理。语法的特性还好说,在这个技术和思想日新月异的年代,一本十年前的语言入门书,可能里面潜藏着很多初学者不容易发现的过时的思想,这才是真正致命的。

第二,Java编程思想只是帮你入Java SE的门,离工业实战开发还有很长的一段距离。公司中版本控制用的是GIT,包管理用的是Maven,类的命名原则,代码重构,以及流行的Java EE和Spring框架等等知识都没有提及。我毕业的时候根本不知道这些,导致了我找工作的时候吃了很多亏。这些东西只好在工作中一点一点重新学起,当然,还包括重新学习Java SE 8……

实际上,Java编程思想已经过时了,虽然豆瓣上评分一片大好。这里我推荐的是最新版的Java核心技术。

另外我发现,Amazon美国上搜Java排名第一的是一本2014年出版的书(基于 Java SE 8),然而国内的Amazon搜索Java,排名第一的仍然是Java编程思想。可见国内仍然很多人在Java SE 6上浪费时间……

我现在选书的几条原则:

  • 大家的评论,以国外的书评网站为主,评价不好的千万别看

  • 讲的是否技术已经过时,优先选择最新出版的技术书

  • 不要买中文书,除非有特别的理由(国内优质原创技术书,不包括翻译书)

坑2 - 提问和交流

学习和开发总是会遇到问题,遇到问题总是需要请教别人,上哪去请教呢?

  • 单独请教身边的高手:可高手一般懒得理你,如果是查Bug或者非常细节的问题,更是没高手愿意理你。基本上高手只会回答观点性的问题

  • QQ群:大部分都在吹水聊天,提问题基本上没人理,并且QQ群里面贴代码的体验很差

  • CSDN:这下有人理你了,可很多人回答问题都是很不负责任的,并且提问需要积分,然而获取积分又非常麻烦

  • SegmentFault:比CSDN的体验好很多,提问也不需要积分,国内比较专业技术问答网站

国内差不多就这些方式了,直到后来我发现了StackOverflow。不好意思,上面都是垃圾。然而StackOverflow是用英文交流的,好多编程术语都不知道,怎么玩?后来,我发现问题的本质在于,看的技术书是中文的

因为看的技术书是中文的,所以只知道这些技术的中文说法,只能和中国人交流,然而编程的世界的语言却是英文。第一,大部分项目的文档和介绍都是用英文写的。第二,GitHub上交流用的也是英文。第三,语言和协议的标准也都是用英文写的……

所以,为了和世界接轨,我开始把我学的东西大部分重新看了一遍英文版的书,不为别的,就为积累技术术语,当然也顺便复习一下。所以后来我选书,基本都是在英文书网站里面挑,很少再看中文书了,避免学习术语的成本。况且中文翻译书,翻译质量参差不齐,指不准就看了一本瞎翻译的书,误入歧途。

那么我现在遇到:

  • 有明确答案的知识性问题(比如程序报错,有小Bug之类的),去StackOverflow问。如果还没有得到解决,考虑:

    • 这个问题是否可以通过查阅相关文档解决?

    • 这个问题是否可以通过查阅相关语言和协议标准解决?

    • 这个问题是否可以通过在邮件组里面提问或者项目讨论区(GitHub Issue)里面提问解决?

    • 这个问题是否可以通过自行阅读代码解决?

绝大部分知识性问题,都可以通过上述方法解决,如果这还解决不了,可见你在使用一个没有开源,没有友好的社区氛围,没有什么人在使用的过气技术,应该思考下你用的这个技术是不是该进博物馆了?

  • 没有明确答案的观点性问题(比如某技术的优势或者未来发展趋势之类的问题),可以考虑:

    • StackExchange的子站点programmers里面提问

    • Reddit的Programming区里面发帖

    • 看该技术领域里面明星人物的博客或者书籍

    • 请教身边的技术大牛

    • 关注各种技术会议的视频和讲稿

    • 自己思考

观点性质的问题,本没有标准答案,当然会比知识性的问题更难获取答案,可是这些问题,却比知识性问题更加重要。知识性的问题,只有对或者错两个结果,你违背了知识,你会立即得到错误。而观点性的问题,就比如选书或者如何交流,如果没有自己的一套方法或者错误的方法,就会原地踏步乃至于南辕北辙。

坑3 - 赶时髦

搬业务代码的过程中,学了很多库的用法,比如说HTTP相关的用过Java的HTTPClient和Python的requests库,写并发会用并发的库,写TCP会用Socket相关的库,做Web用过NodeJS和PHP等……发现很多框架也不难学习,于是折腾了更多的新框架和新语言(Go、Rust)……然而一路折腾下来感觉就是不生产代码,只是做了一把框架的搬运工,搭个架子然后吭哧吭哧写业务代码。最后发现追求新技术有两个问题:

第一,用户并不会在乎你用的什么技术,只要他们用着爽就行了。而这往往会意味着,赶时髦的新技术会因为不好招人以及担心有坑而导致不会被公司采用。

第二,搬运框架并不会真正提升你的技术,除非你能理解整个框架的实现,到源码级别的掌控。

所以赶时髦并不会让你升职加薪,也不会真正提升你自己的技术,那么到底该学什么呢?

学习路径

有篇很有名的文章,Teach Yourself Programming in Ten Years,认为编程专家需要10年的学习时间。并且给出了一些学习目标:

  • 学习十来门语言

  • 参与(有技术含量的)项目开发

  • 维护(有技术含量的)项目

  • 对计算机底层的了解

  • 参与制定一门语言的标准

等等。这些学习目标我也认可,但是比较抽象。

有一份比较实际一点的文章,程序员练级攻略(这篇文章有个坑,它推荐了W3School,实际上W3School是一个过时的有很多坑的网站,我比较推荐movethewebforward)。

这里我谈一下我自己的学习规划:

  1. 学几门流行的编程语言,当然需要找一本靠谱的英文书来学。学习的目标在于熟练使用大部分语法特性以及相关的库函数,也包括引入第三方包以及调试优化等内容。学了之后也可以适当看下中文的技术书,方便中文技术交流。

  2. 学习编程相关的开发工具(IDE,版本控制,文本编辑等),提高自己的开发效率。

  3. 成为一名熟练的框架搬运工,比如搬一下Linux+Nginx+Mysql+PHP搭网站,ELK搭一个日志收集查询展示系统之类的。这些技能只需要阅读下官方文档的就行了。

  4. 阅读语言和协议的标准,参与一两门技术的发展和讨论

  5. 学习操作系统和编译原理,了解语言和协议设计的背后的思路,了解计算机的底层到应用层之间的实现,包括网络并发等领域

目前我只做到第三步……我目前正在看一些语言和协议的标准,以及学习操作系统和编译原理等……

2016-09-12 00:43:45 6条评论
Cinque Terre

dploop

写得太好了!我补充一个,刷题需节制。
2016-09-12 21:16:29
Cinque Terre

cheyulin

2016-09-13 09:21:51
Cinque Terre

leonhardt

提问下,是否有好的购买外文书籍的途径.普通网上英文书是中文书价格的6倍.
2016-09-13 17:49:17
Cinque Terre

Sayalic 回复了 leonhardt

直接下载电子版:http://gen.lib.rus.ec/
2016-09-13 18:34:59
Cinque Terre

端着木鱼敲代码

haohao
2016-09-14 18:10:35
Cinque Terre

ah787264643 回复了 Sayalic

6
2016-09-18 15:17:10
请先 登录 后评论
isaacpei , ifelse程序猿
6 人赞同, 0 人反对

首先说明我讨厌固定的方法

每个人都是不同的,各位大牛也应该有自己的方法,比如教教学生啊,睡前读两章啊,打打炉石啊。。。 所以我所说的,可能有用,也可能是扯淡(当然我就是爱扯淡)

学习路径我认为是一个迭代加深的过程

学习->使用->学习更深入->使用更深入

以下使用入门举例

从入门来讲,语言我还是觉得两个比较好C/Python 。
对于入门书籍的选择,我觉得无所谓,很多人喜欢比较谁的书写的好谁的写的不好,但是不同人有不同的偏好,我觉得意义不大。你能找到的书基本都不会错太多,就算是谭浩强也有无数人看着他的书学会了不少再回来批判他,当然现在他的书已经不多见了。事实上大部分学校的教科书都能达到基本的要求。

入门很简单,C语言看到指针前面,这就够了,我看的是c bible,就是C作者写的那本。
Py也很简单,更加接近自然语言,我是看的learn python the hard way。
甚至某种语言官方文档也是很好的入门资料。

想了想即使到现在这两本也足够入门,简单易懂。

我不理解有人喜欢推荐那种又厚又重,未定义行为都讲一遍的书,这种东西既没啥重要性又不适合入门,看起来真是痛苦。

至于书是中文还是英文,我也觉得无所谓,但是最终要看一遍英文。如果你先看的中文,之后一遍英文的也是十分简单的事情,顶多几个小时。

学习完之后就到了使用阶段
随便选个oj刷10道水题。
课后习题做了

迭代这个过程
再往后我就不讲了,因为我水平就到这里了~

使用工具

书是工具,但是我觉得有点过时(因为我懒得看)。
我觉得现在更好的工具是网络。

个人喜欢直接搜遇到的问题,blog就是很好的地方,stackoverflow也是。
使用工具最重要的问题是选择适合自己的,比如blog搜出来靠前的可能讲的并不是很适合自己的阅读习惯。

正确使用工具是及其重要的能力。

实用主义

我不是理论派,我喜欢讲学以致用,如果没啥用但是好玩也行,去解决问题就是从学到用的过程。

个人认为大部分程序猿都是在这个阶段学到大部分东西的。
比如:

题目tle了,那么可能你会因此学了某种高效算法。
需要做大作业了,那么可能你因此仿写了2048,学会了js里面的动画。

踩坑再爬出来就是提升

总有人喜欢给后面人说自己遇到了多少坑以后别碰。但是我觉得对于学习,踩坑是货真价实的提升。

卧槽我懒得继续写了。。。
学习技术还是上个大学把。。。

最后一句话,证明你能力的最重要的地方是:

  1. 你解决了这个问题

  2. 你把这个东西用傻逼都懂的方式解释清楚了

天天扯图灵机/P=NP的要么是研究理论的要么是装逼的。
技术的发展是为了简单不是为了复杂。

卧槽我写了这么长?

2016-09-13 12:08:56 0条评论
请先 登录 后评论
mickeyandkaka
13 人赞同, 0 人反对

我认为字数越多,赞数越高,这样的现象是不好的。

战略性的方向:

  1. 读个好点的大学的计算机专业
    原因不在于学校,在于你接触了什么样的人,什么样的环境,你就会变成什么样的人。这个甚至比你各种努力还重要。

  2. 大学逼自己多写代码多刷题。为进入大公司做准备。
    只有规模足够大的工资才有平台,才有可能发挥的机会。代码不是为了自我满足,而是要真正服务于千万用户的。除非你眼光毒,不然你赌不起你的时间。

战术性的意见:

  1. 兴趣是最好的老师

  2. 大学专业课别挂,有点印象。以后好随时捡起来

  3. 了解简单的英语

  4. 独立思考,解决问题

若都能做到,几无敌手。


我认为对于不同的时代,介绍不同的术意义不大,c++精通的人,难道不能几周学会java、Python、Golang么;大学高绩点的人,相信对于最新的技术也能有所认知并学习精髓。编程是用于工作,工程中迟早会遇到你完全不会的问题,这个时候能帮你的只有解决问题的能力。

随便聊下,不爽你打我呀。

2016-09-12 22:25:18 3条评论
Cinque Terre

DVan

只有规模足够大的公司才有平台,才有可能发挥的机会。不认同,做什么事情是需要和你的能力相匹配的,指望靠工作来提升自己,是非常不现实的。
2016-09-13 10:41:56
Cinque Terre

Sayalic

多写代码多刷题,具体是刷什么题和写什么代码呢?
2016-09-13 17:43:36
Cinque Terre

ah787264643

有钱赚才是最好的老师!
2016-09-14 08:10:34
请先 登录 后评论
leonhardt
10 人赞同, 0 人反对

准备多一台设备


一个人如果要学习linux,网络原理等知识一台设备远远是不够的,另外想当年高校网络认证需要客户端而客户端(锐捷)只有window版,这导致在linux下我根本查阅资料,做进一步的学习.再比如,当设备在跑扫地机器人或进行复杂的运算时,机器满负载这时候我们不应该只是干等着.

理论知识


老老实实的学习数据结构跟算法,以及基础的c语言.学习这些没有快捷的路径,就是不断地堆时间.如果这些都懂了,其他语言的上手速度就自然而然的快了.
两个例子,@Sayalic 的面试经历,面试官:会做网页吗?S:不会.面:我要你明天就会.第二天S拿着作品去,对方给了offer.
@elf 在做CodeReview-2不会php,但是通过看底层源码却是第一个完成的人.
他们能做到如此,让我觉得语言的之间的差异在强大的基础面前不值一提.

良师益友


任何时候,有一个好的老师,能帮你少走很多弯路,有一个好的学习同伴,能相互鼓励.只有这样才走的不那么累,也能走得更远.可以通过成熟的社区去提交自己学习上遇到的问题.推荐看一下提问的艺术.千里码就是这样的一个不错平台.

获取学习资源


现在大家都能急躁各种教程直播,都希望通过看视频来获取知识因为快.但是要根基不稳,常常看着懵懵懂懂实际上依旧不知其要领.觉得只有通过阅读书籍,因为要实验书籍上的代码可以让发现自己没有注意到的问题.书籍上我推荐红皮书(wrox)跟动物书(O'Reilly).如果遇到专业上的比较冷门或超前问题,可以利用大学的免费期刊网查找相应的论文(尽管国内的抄袭很多).

确定自己爱好


大学学的东西很多是工作后用不到的,加上一个人的精力是有限的,所以大学期间应该尽可能去尝试,去寻找自己的爱好跟侧重点.然后再去针对性的强化它,接着再去找相应的实习.如果给我重新规划大学:大一学习理论知识同时不断关注相关的科技资讯等,实时了解未来的发展趋势并确定自己的学习侧重点.大二确定自己发展方向加以研究.大三寻找符合你兴趣爱好的实习岗位.

笔记总结


我们学过的东西无论如何都是会忘记的,如果忘记了又要重新去把找回来重新学习,相当于浪费了一次学习时间.我们学习的时候应该记下笔记,推荐记在云笔记上不要记在纸上,纸上无论如何你以后都会丢失的,你不可能在你上班的时候桌面上放着你大学记的笔记.记在笔记上以你最熟悉的逻辑来记录的,所以当你重新阅读复习你的笔记的时候,你会很快就重新掌握它.

尾巴

任何时候努力都不晚,很多人直到上大学才拥有自己的第一台计算机,但是另外有一些人他们从娃娃起就开始接触计算机,或是天赋异禀.比如@ikarienator 但这不能成为我们不努力的借口,学习有时候不是为了挣钱更多是为了自己的兴趣以及最初的梦想.希望将来自己的子女在问别人的爸爸的时候,我可以回答"爸爸已经努力过了,虽然爸爸失败了,但是我希望你能成功."而不是让自己子女替自己完成梦想.

2016-09-12 11:29:50 2条评论
Cinque Terre

fakecoder

确定自己的爱好,难吗
2016-09-12 23:04:17
Cinque Terre

Sayalic

这里我要澄清一下……那一次其实我并没有学会网页制作,只是七拼八凑临时完成了任务。实际上学会网页制作至少需要看一遍HTML+CSS大部分标准才算入门……没有任何一门领域可以有捷径可以走……
2016-09-14 18:11:15
请先 登录 后评论
cheyulin , Phd in CSE, HKUST
8 人赞同, 0 人反对

前言

如果让我重新学编程,我会选择自己喜欢的/感兴趣的来学,而不是别人喜欢的来学。学编程的时候要有一个明确的目标/计划和对自己长期的预期。

计算机科学与工程

学习编程语言之前,我觉得得先让自己充分熟悉计算机的基本概念,从宏观上打一下基础。充其量,编程语言只是一种反映我们想法的工具而已。学习计算机,我觉得应该先让自己知道计算机科学到底是什么,解决了哪些基本的问题,这个科学又是怎么应用到工程上来的。如果时光可以倒流,我会重新审慎我本科时候的培养计划,找出我到底要掌握哪些知识才可以成为一个合格的软件工程师/计算机科学学者。按我现在的理解

  • 从理论上来讲

    • 计算理论很重要,我得知道什么是DFA,NFA,正则表达式Recognizer,Pushdown-Automata,图灵机,图灵完备的Ram-Model,NP vs P, 什么是NPC,什么是NP-hard, 什么是reduction。知道了这些才知道之前的计算机科学家/数学家都搞了些什么。

    • 基本离散数学知识/数据结构和算法很重要,作为一个程序员大概需要了解基本的数据结构(至少对语言基本库例如C++的STL或者Java中的Collection实现机制有所熟悉,各种Tree/HashTable等等),算法导论的前面基础部分(递归分治/动态规划/贪心/分支限界法等要知道),算法设计中的近似算法/随机算法/均摊分析要了解一下。这一步最直接就是刷刷OJ上面的题了。

    • 编译原理挺重要,至少得知道程序怎么编译成原生代码执行,或者解释执行的吧。然后像语法分析/语义分析啥的稍微了解下没有坏处。

  • 从系统上来讲

    • 计算机组成原理很重要,计算机组成原理告诉我们怎么利用好CPU/GPU/协处理器,Cache,内存/显存,磁盘,它们的机制,对于写代码有一定的指导意义。

    • 操作系统很重要,至少知道内核怎么把我们计算机组成原理里面学到的这些东西操作起来。

编程语言的学习

  • 可能先学一下Lisp系列的语言,比如Scheme,看看MIT视频学一下,因为语法特别简单,又可以从中学到计算机程序抽象的一些东西。

  • 然后关注以下C或者C++,借此了解一下系统上的东西,怎么利用起来计算机组成原理里面的这些硬件,熟悉一下操作系统内核提供的一些基本系统调用接口。

  • 需要做做小项目的时候,搞个Python玩一下,比较顺手,各种库,比较能实现想的到的Idea;然后有需要的时候玩玩Go,比如写个服务器程序,或者写个单机版本的Map/Reduce。

关注语言的最新标准

关注语言的标准,主要能让我们体会以下编程语言设计者的考虑。因为标准的指定是工业界实践多年,然后发现有些问题,大家填一下坑,让库设计者和库使用者都更容易写出好维护,好写的代码。

使用现有的好用的工具

比如集成环境linux下可以选择Jetbrains家的各种ide,编辑器可以使用Github出品的Atom,然后Github Student Pack上有各种好用的免费试用的一些工具比如说Vps等。

开源社区 & 论坛

我会一开始就注册好Github账号,把自己的学习代码都放上去。然后可以关注有啥新颖的我感兴趣的技术;然后在Twitter上可以关注一些感兴趣的程序设计和大公司的推文。
然后有问题可以翻墙到Google查查StackOverflow,自己如果有新的理解,尝试搭个博客写点心得。

比赛 & 项目

  • 可以通过Acm比赛强制自己熟悉数据结构/算法/图论/数论/计算几何。

  • 也可以搞点比赛,比如啥XXX创新杯什么的,练练写个小项目的能力

2016-09-12 09:02:41 0条评论
请先 登录 后评论
KKSun , stay humble & hungry
6 人赞同, 0 人反对

跳坑的人

现在的我,在一个和计算机毫不相关的专业,自己一个人学习编程和其他计算机知识,自己一个人做着练手的项目……

悔不当初→_→

至自己和其他转行者

希望能在编程和计算机的海洋里找到自己的快乐,并为之奋斗下去。

2016-09-12 19:52:22 2条评论
Cinque Terre

leonhardt

目测是@东云 →_→
2016-09-13 10:17:42
Cinque Terre

KKSun

哈哈哈,我在千里马还一个人都不认识呢~~肯定猜错了~lol
2016-09-16 01:04:35
请先 登录 后评论
v2excoc
5 人赞同, 0 人反对

学习方法有两条路。一条是功利性的,一条是提升眼界和整体水平的,两者完全不同。前者把时间花在最有价值的技术上,有利于以后工作/面试/升职加薪。后者例如刷刷技能树,开阔一下眼界,有利于超长期的技术规划发展。。

个人而言,是偏向后者的。提升整体长期编程技能,并没有太过取巧的捷径方法,有些坑踩过才会记忆深刻,有些代码错过才会理解正确写法的重要性,就是花时间。而这些经验,都是日积月累起来的。并不是说简单的跳坑解决业务问题,技术就能全面提升了,在不同领域的编程思维模式,差别巨大。

如果说这些年有什么后悔的,只能说还是不够努力。很难的坎,需要用巨大的集中力去攻破。也许一旦松懈下来,就很难再有良好的编程和学习效率。

说点实在的,如果能重学一次编程,要提升水平的话,英语很重要,比赛很重要,看正确的书很重要,学习大牛写的代码很重要,点千里码技能树很重要。如果你所有的这些都做到了,水平还是上不去,那只能说“爱的不够深”!

2016-09-12 12:40:09 0条评论
请先 登录 后评论
amosbird
0 人赞同, 0 人反对

只后悔当初没学C,学的Pascal

2017-08-16 21:40:00 0条评论
请先 登录 后评论

啦啦啦

回答
正在加载中

您未提交【码之初】的正确答案,暂不能回答相关问题。 如有疑问,请发起讨论