你们会向新人推荐 C++么?

2016 年 8 月 18 日
 xiqingongzi
/t/300012 提问 C++ 的路线图,很多人都在劝我放弃
但我是起意学 C++ 一方面是个人需要,另一方面是我的一个堂叔推荐我学 C++的。

什么样的情况下你会推荐别人学 C++ 。什么情况下不推荐 C++?

我觉得我堂叔不至于坑我吧....
13266 次点击
所在节点    C
174 条回复
initialdp
2016 年 8 月 19 日
对初学者,我会推荐 Python 或者 java ,了解到一定程度后,会推荐 C 。一般不会推荐 C++,这要等新手成为老手后,自己有兴趣就去学呗。

至于地址、指针等这些概念,如果以后主要做业务层面的开发,可能几乎不用理会这些概念,还不如多花时间去了解业务逻辑、行业知识等更实在些。当然,如果有兴趣去学习或者工作上有需要去学习,再了解也不迟,这些也不是什么了不得的概念,花点时间就能掌握,没有必要过度强调。
pxlxh
2016 年 8 月 19 日
鼓吹底层的大妞们

你们真的要这样坑人吗
wizardforcel
2016 年 8 月 19 日
@lizon

[你认为一开始就应该给初学者提供比较完善的语言和类型系统,让初学者知道什么是对的,什么是先进的,以最快速度学习享受到现在最先进的理论成果,更多的关注语言本身的描述能力。]

你觉得先有认识还是先有实践??

如果一个人之前见识到了高级语言的完善,才可能探寻在 C 中怎么实现。如果一个人先接触了 C ,在接触其它语言之前不可能凭空发明出这些完善的设计。能凭空发明的人也不会在这里问问题。

具体来讲,一个人之前如果没见识过 C++(或其它语言)的 Map ,自己还真不一定能想出来并实现这个 Map 。一个人如果没见识过 Golang 的 GC ,也不可能想出来我也在 C 里面实现这个 GC 。

[我认为一开始应该提供给初学者最大的自由,暴露合适的硬件细节,让初学者明白计算机到底在做什么]

光有自由是不够的,需要见多识广。

小学生设计的汽车能上天入地,工程师设计的汽车就是现在的样子。

[我说的奢俭,是指初学者一旦高级语言用爽了,屏蔽了本来应该了解的细节,很可能就呆在舒适区不想出来了,称他还没养成惰性,照脸糊 C ]

如果一个人学了 Python ,并且认为解释器及下面都是黑盒,那它就不适合做程序员。不要妄想着学 C 给矫正过来。 C 有没有细节??一个人学了 C 之后,不想了解汇编、指令集、流水线、数字电路,你又能怎么办?

[面向初学者的教材几乎全是 C ,算法教材也大部分是 C 代码或者类 C 伪码,各大高校开设的计算机课程必定有 C ,已经为初学者尽可能降低了学习曲线。 ]

拿数据说话,你可以统计近几年的数据结构和算法书,从豆瓣上找。也可以统计国内外大学开的导论课。

[初学者需要“学习 C ”,而不是“精通 C ”,不要去研究 C 语言本身的细枝末节,最主要是理解指针概念。 ]

请把编程和计算机原理 /系统的学习分开。

如果大部分语言都适用于没有指针(或者只有弱指针)的设计,那么就**编程**而言,没必要搞懂指针。

指针可以放到 System 相关课程里去学。一开始接触指针会徒增入门的难度。

[为什么 C 语言最合适,往上看,高级语言写法风格大都类 C ,要学习其他语言并无太大的不适应。 ]

你这个论据也能说明“先学其它语言再学 C 也并无太大的不适应”。

实际上先学 C 会不适应(或需要重新学习)其它语言的 FP ,或者 OO 。反过来倒是无大碍。

[如果是做语言研究,连用 C 入个门都困难,或者跌入个 C 设计上的坑都要大呼小叫,我觉得可能他的能力不适合做语言研究。]

请把“学习编程”或者入门跟学习 PLT 区分开。

[在不清楚这个初学者以后到底要干什么的情况下,在初学者连自己都不知道自己到底要干什么的情况下, C 是性价比最高的语言。]

在不清楚这个初学者以后到底要干什么的情况下,就不要假设初学者以后搞 CS 研究或者搞 IT 。这种情况下,应选择一种尽量“普适”的语言。如果学了 Java 或 Python ,假设以后不干这些了,还能编个程序跑数据,解决那个领域的问题。学了 C 能干嘛呢?
wizardforcel
2016 年 8 月 19 日
鼓吹底层 /system 的人总是说面向硬件编程比面向 OS 和互联网编程更重要,好像把它们派到阿里都能成为第二个马云似的。

我对 binary 和逆向感兴趣,但我绝对不强迫别人研究这东西,尤其是不强迫新手一入门就研究这东西。

OS 都知道把交互型进程排前头,把计算密集型进程排后头。至少比某些人聪明。
x8
2016 年 8 月 19 日
@wizardforcel 我之前的回答都是在强调:起手学 C ,并不是只学 C ,并不是要求精通 C 。

就计算机知识体系来说, C 是最佳的线索。我对初学者的假设是“想了解计算机体系结构,但是没有人带领”的人。在学习 C 的过程中,会碰到很多问题,一方面是语言造成的,一方面是底层封装不完善造成的,在解决问题的过程中,一方面可以接触了理论知识,一方面可以接触硬件知识,对他自己寻找方向是有好处的。一旦找到了自己的方向,那还用不用继续学 C 就是他自己的兴趣问题了。不要以为跑数据写代码就是计算机的一切,你说的“普适”的语言对于想玩硬件,从事嵌入式系统内核开发的人有意义吗?

如果你身边就有很好的学习资源,或者你已经找到了自己的方向,那随便怎么学都可以,反正方向明确有人带。
kingddc314
2016 年 8 月 19 日
我也是服了你们这些长篇大论的
wizardforcel
2016 年 8 月 19 日
@lizon

[你说的“普适”的语言对于想玩硬件,从事嵌入式系统内核开发的人有意义吗? ]

你说的内核开发,或者嵌入式占市场的百分之多少?为了一颗树放弃整个森林??

在如今嵌入式如此低迷,工作环境如此恶劣的情况下。圈内人都不想拉新手入坑,你可倒好。在不清楚这个初学者以后到底要干什么的情况下,你就把人往坑里带。

你可以问问身边的人,互联网和嵌入式他们优先选哪个。
x8
2016 年 8 月 19 日
@wizardforcel 我往坑里带了吗?没有说学 C 就一定要用上 C 。
我只是觉得应该给予初学者最大的自由。喜欢硬件就往硬件发展,喜欢软件就往软件发展。在学 C 的过程中寻找自己感兴趣的东西。说不定他就是下一个优秀的硬件工程师。
对于上层开发,我很担心初学者过早用上高级语言会养成思维定势,形成舒适区,抵触底层细节,对发展有害。
FrankHB
2016 年 8 月 19 日
@lizon

> 就计算机知识体系来说, C 是最佳的线索。我对初学者的假设是“想了解计算机体系结构,但是没有人带领”的人。

我之前说过了,就是需要学 C , C 也不适合放在最前面,因为基本上总是有更合适的路径。似乎你总是无视这个选择。

> 在学习 C 的过程中,会碰到很多问题,一方面是语言造成的,一方面是底层封装不完善造成的,在解决问题的过程中,一方面可以接触了理论知识,一方面可以接触硬件知识,对他自己寻找方向是有好处的。一旦找到了自己的方向,那还用不用继续学 C 就是他自己的兴趣问题了。

这仍然只是说明 C 是可选项,而不一定就是最合适的,也避免不了对于大多数需求事倍功半的事实。

> 不要以为跑数据写代码就是计算机的一切,你说的“普适”的语言对于想玩硬件,从事嵌入式系统内核开发的人有意义吗?

至少就 C 来讲在这里是不得不有意义的,因为 C 的设计自身极端强调这个层次上的“普适”。

要从事嵌入式系统内核开发,也不可能一开始就学嵌入式系统内核开发专用的 C 。何况任何 C 的方言无法绕过 ISO C 这个基础 spec ,否则就不是 C 了。

有些领域入行了提升并不是很困难,困难主要因为不是这个领域的公共基础的难度堆起来的。自担风险。

> 我往坑里带了吗?没有说学 C 就一定要用上 C 。

学了不用和为了不浪费之前没规划好学的东西而去用一样是坑。正确的姿势是为了用而学。

你可能会说学 C 是基础积累,不直接用也可以发挥作用。遗憾的 C 在许多人眼里的“底层”是假象,而对大多数人的目的来说,发挥的作用经常有其它更合适的学习路径替代。
FrankHB
2016 年 8 月 19 日
@ecloud
K&R 当时的确是想发明“更好用的汇编”,但显然不止是汇编,不管是以 B 作为基础和有意无意保持可移植性。
不过我基本同意“低级语言特性”主要是实现的锅。但是提交标准化以后,这些锅最终都尘埃落定了。
在我的印象中伪码是历史上因为编译性能等因素才体现出有意义额外流程。现在并没有这个必要。
与其说 Pascal 是背惯了实现的锅,倒不如说是后续长期疲软才是致命伤。
互操作上的先天不足和其它一些不方便的特性(如 Why Pascal is not my favorite programming language 所说)使市场已经倒向了 C ,在之后没有靠标准化扳回一城于是满盘皆输。

关于强弱类型的问题,实际上和 C 没有直接关系。
按 C 的概念, if(a=5)不管和 typing 还是 type checking 都没关系,所以传统上跟强弱类型的论战也没交集。
当然理论上来说还是可以有的,但按 C 声称的设计,死活不承认 lvalueness 是类型系统的一部分(倒也不像 B 一样直接作为文法元素的性质),那样怎么说都通。
lytofb
2016 年 8 月 19 日
第一反应就是——现在不是都用 go 了吗?结果发现没啥人推荐。
用 GO !!!(望赐教)
linuxchild
2016 年 8 月 19 日
想知道细节还是看一下比较好
x8
2016 年 8 月 19 日
@FrankHB 在细分领域,总有比 C 更好的选择,是的。基于目的去学习相应语言,造成的时间浪费最少,是的。
如果找到方向了,大可以转投更有针对性的领域,在此之前学一学 C ,软硬都了解一下,没什么不好
yuankui
2016 年 8 月 19 日
堂叔。。。
现在都什么年代了
C++在你堂叔那个年代的确有他的地位,但是放到现在,哎。。
xiqingongzi
2016 年 8 月 19 日
@yuankui 我堂叔今年 28.。。。在广联达搞 CPP 开发。
yuankui
2016 年 8 月 19 日
@xiqingongzi 哦,搞 CPP ,在互联网公司基本找不到工作。。
而且你看 V2EX 里面讨论 CPP 得多呢,还是讨论 python , js , php , java 的多呢?
R4rvZ6agNVWr56V0
2016 年 8 月 19 日
”面向工资编程“
FrankHB
2016 年 8 月 19 日
@lytofb 当初吹要取代 C ,还不是只能老实当 DSL ……
@lizon 细分领域到最后是项目一有需要就人手撸个新语言实现而不用担心成本。靠 C 糊弄明显是初级阶段的初级阶段。 C 现在除了本来合适的领域,实际项目中主要也就继续靠实现其它语言(以及死皮赖脸装作能霸住互操作接口)刷存在感(虽然 Lisp 和搞所谓 FP 语言的那伙人多数早就对此没兴趣了)。
毕竟现在条件好了能用的选择多了,不需要在此浪费时间。
crayygy
2016 年 8 月 19 日
分享葛平的单曲《猿泡沫》 http://music.163.com/song/31477115?userid=20205551 (@网易云音乐)
miao1007
2016 年 8 月 19 日
学 C 是兴趣提升,学 Java 是谋生手艺

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/300102

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX