给编程爱好者的一点入门建议,2016
novakon2016/08/04软件综合 IP:广东

编程的终极目的是让计算机替人类完成工作,从而降低人类的劳动强度。

说到编程就离不开编程语言,初学者会为此提很多问题,比如应该先学C++还是Java?Java和C#哪个好?应该学Objective-C吗?

根据楼下坛友反馈,删掉了前两节。

  1. 绝对不要学Java

    Java 是公司产物。它有很多优点,比如说跨平台。但是今天几乎什么东西都能跨平台——正如不应该为了周围串门而学习开锁,你不应该为了跨平台而学习一门语言。

    除此之外,不要学C#,它也是公司产物(有很多职业程序员认为C#比Java优秀,然而大部分语言都比Java优秀)。它们善于解决基础设施问题(比如在Java和C#中,大部分常用的系统功能,都有框架和库,而且效率非常高),因此它们看上去更像重型工程机械——水来土挡,无坚不摧。

    虽然你的家人可能根本不懂什么是编程,但你可以尝试跟家里人说“我要学习驾驶重型工程机械”,然后感受一下家里人的态度。

  2. 绝对不要钻研微机原理

    智力正常的人能够在通读教材之后掌握x86架构,了解诸如VLIW之类的概念。掌握即可,绝对不要钻研。

    对于爱好者,最佳钻研方式是想办法去Intel或者nVidia上班,或者准备至少10亿人民币,开一家自己的IC公司。

    之所以要专门提这一点,是因为钻研这类技术非常容易让人上瘾——但是实际上几乎学不到任何有用的东西。最终你会更擅长crack,但未必善于make。

    而在工作中如果真的有需要,你可以随时开始翻书,无需预先精通。

  3. 绝对不要放弃数学

    如果数学成绩不好,想办法把数学成绩弄好,比如请1小时100元的家教。而不要花1小时1元的电费研究程序设计。

  4. 劳动强度 vs 学习强度

    这是对以上几点的总结。

    作为爱好者,你的时间是无限的;作为学生,你的时间是无价的。在编程实践中,你会明显地发现,劳动强度和学习强度是两个维度。钻研某些问题时,劳动强度较高,比如如何调用avcodecxx.dll,如何 call Win32API,设计模式,回调参数……而在钻研另一些问题时,学习强度较高,比如如何遍历有向图,如何索引10G k-v对,如何用二叉树构建一个对象……

    尽量选择学习强度高的挑战,虽然它们并不能立竿见影产生装逼效果。

[修改于 8年3个月前 - 2016/09/28 17:21:49]

来自:计算机科学 / 软件综合
31
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon 作者
8年5个月前 IP:广东
824096
引用 celeron533:
第一条太绝对了。存在即合理,如果一个语言真的有种种问题,是不会流行的。
我的建议是给编程爱好者的,不是给程序员的。作为职业程序设计师,需要用什么语言就学什么语言呗。但是作为给初学者的推荐,我认为Java在培养编程思维方面的效率非常低。相对地,我认为Python、Ruby、Lisp 这些语言更应该作为初学入门。

so Java很流行,但我真的不想让同学们一上来就啃它。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
8年4个月前 IP:广东
824199
引用 acmilan:
个人认为吧,首先要精通C语言,然后学习一点C++的皮毛(看懂C++ Primer就够了),然后基本上有三条康庄大道在你面前:

1. 尽快找到饭吃:学Java
2. 尽快做出Windows程序:学C#……
米兰又黑JS。我在“动态网页挑战”里面,演示了JS的高级抽象能力:将【顺序处理用户的多次访问】,从【状态机】写法改为【异步+闭包】写法,且不使用任何设计模式。
JS语法像C,表现力接近lisp,因此我认为从JS入门不是bad idea。

Chrome Embedded Framework垫背!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
8年3个月前 IP:广东
826060
两个月过去了,回来修理一下措辞。

首先是“绝对不要学Java”,再重申一次这是给初学者的建议,而不是说Java不好。Java和C#都拥有很完善的库,可以干很多事情,可以解决很多问题,有利于提高学习兴趣,但初学者把这些高级语言作为起点开始学习的话,最后很有可能写了一大堆程序,结果除了记住一堆API,别的啥也没学到。我本人编程是VB6入的门,从第一行代码到现在也有9年了。跟楼上的经历类似的是:只有在接触了真正的“计算机科学”之后,我才醒悟过来,原先的各种折腾,除了训练基本的程序思维之外,对进阶学习并没有多大的帮助。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
8年3个月前 修改于 8年3个月前 IP:广东
826063
然后是“绝对不要钻研微机原理”,好吧其实微机原理很酷,搞懂x86处理器和系统总线,对设计操作系统有很大帮助。搞懂存储器和网络适配器对设计数据库和分布式系统有很大帮助。
所以,我觉得还是删掉第二条吧,在我想到更好的表达方式之前。
-----
其实一个程序的写法,是随着计算架构在不断变迁的。比如说高性能计算会用到GPU,GPU就不能当图灵机来用(也不是不行,就是特别慢),因此给GPU编程就需要专门的语言,也需要了解GPU原理及架构。
-----
计算机的架构发生变化的一个主要原因,就是摩尔定律输给了量子物理,图灵机的工作频率不能无限制地提升。于是程序员们想了很多办法,把原来串行运行的程序一点点地修改,让它们适应并行架构,以充分利用并行架构带来的性能提升。
-----
随着技术的进步,计算机科学家们提出了很多新的思路,比如程序可以仍然按照串行方式书写,然后自动转换为并行形式运行。古有Erlang, OpenGL, 今有MapReduce, TenserFlow, 其实都是这个意思。
-----
那么随着时间的流逝,也许有一天我们可以用某种很高级的语言,比如现代汉语,告诉计算机应该做什么。我们只需要描述程序逻辑,背后的并行化、运行时优化都是自动的,运行速度也快得吓人。
-----
到那时,程序员最重要的能力就是逻辑和抽象能力,而完全不需要了解系统底层架构(反正优化都是自动的,速度很快,要干啥都行)
-----
但是我仔细想了一下,这是不符合经济学原理的。计算机系统就算再快再廉价,也无法满足人类的无限需求,换言之“怎样让同一个程序跑得更快”将成为永恒的话题。换言之,50年之后我们仍然需要很多通晓计算机原理的人才。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
8年3个月前 IP:广东
826153
引用 acmilan:
有吃了第五个馒头饱了而忘了第二个馒头之嫌。

先以C#入门并无不妥,但是不要固步自封,不要误入反复设计界面、反复尝试API的歧途。不要过分夸大工具的作用,编程语言只是认识计算机世界的一个窗口而已。
响应您的观点,原文已经删掉第一点。

再仔细一看,基本上就等于没有任何建议了。

其实编程这个事情挺反人类的,大家接触并爱上程序设计往往是因为各种偶然巧合,很难给“初学者”做一个准确的定义——每个人最初想要学习程序设计的理由都是不同的。

acmilan提出的馒头观点,我总觉得似曾相识——比如很多NodeJS爱好者都曾经写过php,相当于说如果没有php,许多爱好者连门都入不了。

那倒不如大胆一点想象:2030年最流行的编程语言是什么?假如一个人在2016年能够学习2030年最流行的编程语言,他一定是很幸运的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
novakon
学者 机友 笔友
文章
1256
回复
8386
学术分
16
2008/03/29注册,2年10个月前活动

已走,勿送

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}