程序员需要知道什么? zz

作者: 黄镭 
 
程序员需要知道什么?

  作为程序员必须掌握的最基础的知识是什么?在做了十几年程序员后回头看这个问题
,我发现最基础的知识既不是某种语言的语法,也不是算法。而是计算机的工作原理。因
为程序员的工作是指挥计算机按照他(她)的想法干活。不了解计算机的脾气是无法有效
的指挥的。计算机非常"笨"而且"懒",必须使用排列好的指令序列(程序)去"踢"它,"踢
"一下它才动一下,不小心把它"踢"进了死胡同,它是不会自动转出来的。这给程序员带来
了无穷的烦恼,程序员必须为计算机预先考虑各种意外情况,并设计好应变的措施,只要
有一种情况没有预计到,总有一天你的计算机就会可悲地失败。

  计算机的工作原理将详细的告诉程序员计算机各种弱点和优点,你将清楚计算机在各
种死胡同面前的反应。工作原理不但告诉你计算机会怎样做,还告诉你计算机为什么会这
样。

  那么了解计算机工作原理的最佳途径是什么呢?

汇编语言

  对了,汇编语言!

  现在的程序员实在是太舒服了,在十几前,即80年代初期,程序员开发工具(语言)
只有几种,而且十分原始,如果想写点有意思的程序,比如图形界面的游戏,就必须深入
了解计算机的结构,通过汇编语言来完成。屏幕上的图形需要一个点一个点地描。虽然辛
苦,但是这样一来计算机在程序员面前就像透明了一样,甚至在梦中我可以见到CPU内部数
不清的电子开关在我程序的指挥下不停地开合(那时计算机也不快)。计算机一点都不神
秘。

  当你使用汇编语言的时候,计算机就成了一个玻璃瓶,你可以看到计算机所有的内部
结构,你将很快明白什么是赋值,什么是循环、什么是判断、什么是子程序、什么是函数
。当然二进制就更是家常便饭了。有人可能会说这些概念在任何高级语言都有而且更容易
理解。在这里我引用一段《C++参考手册》中的一段话:"一个对象是一片存储区域,左值
是引用一个对象的表达式",(所谓左值指的是赋值号左边的东西),这是对赋值语句和变
量一个极为抽象的解释,但也是一个最简单的解释,如此晦涩的语言,对于许多只是用高
级语言的程序员来说是十分难懂的。即使是C程序员也需要消化半天。但是对于汇编程序员
来说只要看到"左值"的解释就什么都明白了。再举一个例子:大家可能在入门的时候为I=I
+1这样的表达式迷惑过。但是汇编就经常使用有限的几个寄存器自加自减。另外,编译和
连接的概念就不是所有语言都有的。

  现代的高级语言,即使是向C/C++这些相对低级的语言都使用了各种库程序对程序员隐
藏了许多计算机的细节。也就是计算机被"封装"了,在很大程度上程序员不需要考虑普通
功能的实现细节,恐怕即使是科班出身的程序员也只有在学习算法课程的时候才写过排序
代码了。这种情况下程序员面对的不是真正的计算机,而是各大软件公司为大家安排好的
虚拟机而已。程序员不需要去记汇编的语法,取而代之的是必须记住新语言的语法,开发
环境的使用规则,编译开关、连接开关等等。同样都是记忆,但是只知其然,而不知其所
以然。掌握汇编的程序员在接触这些工具的时候则不需要死记硬背,因为开发环境也是程
序,不这样还能怎样呢?

  我提倡程序员的入门语言使用汇编语言,有人可能会说汇编语言很难,其实这是误解
。想象一下,一个对计算机没有多少认识的初学者,任何语言的语法都不会有很大差别,
而且汇编码都十分简短,比起某些高级语言长单词的语句来说要容易记忆,尤其是英语都
没学好的中小学生更是如此。二进制可能会有点困难,不过相信能够记住九九表的学生会
很容易记住二进制的加减乘除的。

  现在使用汇编入门的实际困难是现在的CPU已经十分复杂了,多了许多新概念,如内存
保护,进程切换等。不过这对理解操作系统和多线程编程十分有用。又有多少程序员真正
理解了线程和线程同步呢?

以后的道路

  我声明,我不是使用汇编打天下的程序员。实际上我有15年没有碰过汇编了。但是汇
编的确为我打下了坚实的程序基础,并教会了我(或者是迫使我)学会了许多编程技巧,
并使我了解代码风格的重要性。

  汇编是学习计算机工作原理的好工具,也是学习编程的好工具,但我认为汇编不是一
个写程序的好工具。在掌握了基础知识后,再学习一个使用的语言和掌握一个方便的开发
工具是必要的。可以说一旦掌握了汇编,你就已经入门的,以后的道路可以自由选择,也
可以自由更改。 
 
2001年9月9日 
 
基于html+python+Apriori 算法、SVD(奇异值分解)的电影推荐算法+源码+项目文档+算法解析+数据集,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 电影推荐算法:Apriori 算法、SVD(奇异值分解)推荐算法 电影、用户可视化 电影、用户管理 数据统计 SVD 推荐 根据电影打分进行推荐 使用 svd 模型计算用户对未评分的电影打分,返回前 n 个打分最高的电影作为推荐结果 n = 30 for now 使用相似电影进行推荐 根据用户最喜欢的前 K 部电影,分别计算这 K 部电影的相似电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now 根据相似用户进行推荐 获取相似用户 K 个,分别取这 K 个用户的最喜爱电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now Redis 使用 Redis 做页面访问次数统计 缓存相似电影 在使用相似电影推荐的方式时,每次请求大概需要 6.6s(需要遍历计算与所有电影的相似度)。 将相似电影存储至 redis 中(仅存储 movie_id,拿到 movie_id 后还是从 mysql 中获取电影详细信息), 时间缩短至:93ms。 十部电影,每部存 top 5 similar movie 登录了 1-6 user并使用了推荐系统,redis 中新增了 50 部电影的 similar movie,也就是说,系统只为 6 为用户计算了共 60 部电影的相似度,其中就有10 部重复电影。 热点电影重复度还是比较高的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值