编程的本质是对大量问题的发现、分析、归类、建模、解决、测试、优化……
而你说的C/C++/Java,是编程语言,是拿来写代码用的。写代码这部分工作,精确点说,行内俗称coding。在上述工作中,属于“解决”这个环节。当然,coding 是很重要的,毕竟上述的那么多环节的工作,最终大都会以各种各样稀奇古怪的代码体现出来(另外一部分体现方式就是各种文档了——考虑到 doxygen 的话,有一部分文档其实也是代码)。但编程的大多数重要的工作,其实都不在 coding 上。说得难听点,coding 现在已经越来越变成一个体力劳动了。
所以,当你把全部心思都集中到了 coding 这个技能的时候,你可能会觉得你学会了全部语法,但不知道要拿来干嘛,也不知道能干嘛——谁都不会没事一天写几百个hello world,或者冒泡排序,对不?原因就在你没学也没做除“解决”以外的所有工作环节。别人嘲笑学傻了的程序员,说的是:手里拿个锤子,满眼都是钉子。而你呢,则是:手里拿个锤子,但不知道哪个是钉子。
所以,编程的问题,往往是以类似形式出现的:
……
而难的麻烦的问题,往往还是上述几个因素的交叉混杂。
总之,当你抱着本《21天学会 XXX》、《XXX语言程序设计》猛看,就以为在学编程的话,那只能说你的方向有根本性错误。因为这些东西本身(语法/编程规范等)真的不难,大多数高中理科生都不应该学不会。实际上,大多数合格的程序员,如果有必要去学习一门全新的编程语言的话,一般一两个星期就能说初步掌握,一个月就基本 ok 了(事实上在工作中如果真遇到这情况,往往还没这么充裕的时间)——这能叫难吗?
如果就这难度的东西,在你口中都严重到“就算学很久也可能不会“,那恕我直言,趁早转行吧,老天爷没赏你吃这碗饭。
其实我没学之前也觉得难,等学了一段时间之后我觉得挺简单。
之后一直都觉得编程根本就没有什么难的点,真正难的地方,都不属于编程的部分。大部分跟我说难的人,基本上都是不想学,不认真的,他们只是不想去思考而已。
直到我碰上了一个学生。。。他其实学习蛮认真的,很积极,很愿意问问题,但是他真的是一个让我体会到绝望感的学生。。。那个时候一点点编程里的基础概念,我用了可能七八种不同方式和角度来解释,连旁边来问问题顺便听了一点的几个学生都已经搞明白了,他还是不能理解。。。最终我只能放弃了。。。我在内心建议他换个专业吧。。。
那次之后我仔细考虑过编程里面到底有没有难点。我的结论是,有的。但是编程里真正的难点,按理来说在之前的教育里应该已经被训练和克服了。编程用到的最基础的思想工具其实基本都可以从最基础的数学教育里学习到。除非你当初学数学的方式不正确,否则小学应该就能获得基础的思想工具来编程了。
编程在思想上有两个难点,一个是要懂得抽象,另一个是逻辑要严密清晰。
所谓抽象,拿个最基础的例子来说。最早期开始学习数学的时候,我们会教,如果你有两个苹果,然后妈妈给了你两个苹果,你现在就有四个苹果啦!这里其实就已经隐含了关于如何进行抽象的教育了,把具体的苹果,抽象为抽象的数,忽略了苹果的绝大多数特征,只保留它关于数量上的特征。编程里时常要使用类似这种抽象的方式,提炼出需要的部分,然后在编程范式的框架里表达出来。如果始终无法理解两个苹果跟数字2有什么关系......那真的没法编程了。
另外一个是逻辑上必须严密清晰。日常生活里很多经验性的认知往往是直观和混沌的,我们在描述的时候往往是不清晰的,而且我们已经习惯了这种表述和认知方式。编程的时候不能那样去认知,必须有严密清晰的逻辑。打个比方,我不知道你们有没有经历过,但是我妈逻辑特别不清晰。比如说我开车,问她在哪里停,她会跟我说,在前面停。我会问她,在前面哪里,可不可以给一个大致的距离评估,或者给一个标志性建筑,或者你跟我约好停之前多久喊停。她就会很不耐烦......
如果是懂得如何抽象思考,并可以判断出怎样的表述是逻辑清晰准确严谨的人,是不会觉得编程难的。尤其是在现代软件工具的帮助下,编程本身是非常简单的,因为可以分解成一步步来进行,心智负担特别小。比什么下棋啊,数学啊,算法啊,那种需要大脑承载大量信息进行推理,分析判断的问题要简单多了。
编程都不难。你学不会因为编程有一个学习曲线。你必须坚持学习至少150小时左右才能入门。假如你没能坚持到150小时,那肯定学不会。当然也可能是你的教程太烂。
要是是射手和辅助一起情侣在自己队,就知道连体婴儿这把基本凉了
这是我看到的最准确的总结。
总的来说,就是中国的高考相对公平,所以性价比极高,所以其他活动都可以适当让步。