A. 顶级的程序员是怎么样的
顶尖程序员常说:“这个我以前写过一个模块,我找找,很快。“简直是没有对比就没有伤害!
有人认为,普通程序员用复杂的代码解决简单的问题;而高级程序员能把复杂的问题简单化并用简洁的代码去实现。在w3cschool看来,顶尖程序员和普通程序员至少在以下6个方面大有区别。
1、文档能力
“文档是第一生产力”,这一点在程序员的世界是毫无异议的。看看Spring,hibernate,Struts等最流行的开源软件的文档就知道,他们tutorial,他们的getstarted,他们的reference文档写的多么的易懂。
如果要获得更高的报酬,文档是绝对关键的因素。有文档就有沟通,就有交易。搞技术的容易忽视文档的力量,也因为写文档十分困难,更多程序员选择舒适区,习惯写下代码,但正因为如此,妨碍了不少程序员的进阶。
2、解决BUG的效率差别
普通程序员可以利用搜索引擎(网络)寻找答案,经常性找不到好的解决办法,然后更换技术方案!顶级程序员也利用搜索引擎(Google)寻找答案,一般bug都顺利解决(其实跟前期框架选择等关系非常大)。
3、表达能力
表达能力决定了你所做的技术的影响范围,决定了你的影响力,决定你的威信,决定了你的报酬。普通程序员和顶尖程序员的表达能力差别非常大,这主要还是取决于他们格局的不同。良好的沟通能力让你理解产品经理的设计思路,让你更好的展现自己的特长。
对于累积人脉,当你的阅历越来越丰富,人脉对你的帮助也越来越明显。
4、优雅和美观的抽象能力
普通程序员和顶尖程序员之间的区别在于优雅和美观的抽象能力。好的系统通常是要做到两个方面才合格,其一是好用,其二是好看。但是令人遗憾的是,普通程序员仅仅从实现的角度进行堆砌。顶尖程序员往往能够更进一步,经常会去思考用户在操作这个功能的时候,到底还会做什么事情。
所以,顶尖程序员和普通程序员区别就是是否拥有用户意识,是否敢于直面用户。好用,好看一直是软件能够被普遍采用的前提,因此,我们有必要学会抽象优雅。
5、面对如何开源社区态度
普通程序员几乎没有在开源社区混,这也导致经常对新技术发展关注度低。而顶尖程序员则是拥抱开源社区。
6、面对功能点
普通程序员:立马开始构思自己如何实现脑海里出来一个方案。
顶尖程序员:发现功能点很普通github上面早已经有非常多的解决方案,着手根据业务选择一个最适合最优的方案
B. 如果想成为一个程序员应该学习什么知识
声明:以后计算机也就没什么前景了 只能成为一个辅助工具
(1) 熟练掌握基本算法和数据结构,用C语言编制程序;
(2) 掌握数据结构、程序变速器和操作系统的基础知识;
(3) 了解软件工程、数据库、多媒体和网络的基础知识;
(4) 掌握数制、机内代码及其算术运算和逻辑运算的基础知识;
(5) 了解计算机的体系结构和主要部件的基础知识。
1.1按照软件设计说明书,能熟练使用下列程序语言编制程序
1.1.1C(美国标准)
1.2理解给定程序的功能,能发现程序中的错误并加以纠正
1.3具有良好的程序编制风格
1.4基本算法
1.4.1查找、更新、排序、合并及字符处理
1.4.2迭代、插值、数值积分、矩阵计算、议程求解和搜索求解
1.5程序编制方法
1.5.1分支、循环、子程序(过程和函数)、递归
1.5.2输入输出和文件的处理
模块2:基础知识(程序员级)
2.1软件基础知识
2.1.1数据结构基础
数组、记录、列表(list)、队列、栈(stack)、堆(heap)、树和二叉树的定义、存储和操作
2.1.2程序语言基础知识
·汇编、编译、解释系统的基础知识
·程序语言的数据类型
·程序语言的控制结构
2.1.3操作系统基础知识
·操作系统的类型和功能
·操作系统的层次结构和进程概念
·作业、处理机、存储、文件和设备等管理的基础知识
2.1.4软件工程基础知识
·软件生命周期各阶段的任务
·结构化分析和设计方法
·面向对象基本概念
·软件开发工具与环境基础知识
2.1.5数据库基础知识
·数据库模型
·数据库系统的结构
·SQL的使用初步
·常用数据库管理系统的知识
2.1.6多媒体基础知识
·多媒体基本概念
·常用图象文件
·简单图形(线段和圆)的计算机图示
2.2硬件基础知识
2.2.1数制及其转换
·二进制、十进制和十六进制等常用数制及其相互转换
2.2.2机内代码
·原码、补码、反码、移码
·定点数与浮点数的机内表示
·ASCII码及汉字编码等常用的编码
·奇偶校验码、海明码、循环冗余码(CRC)等常用校验方法
2.2.3算术运算和逻辑运算
·计算机中的二进制数运算方法
·逻辑代数的基本运算和逻辑表达式的化简
2.2.4计算机的体系结构和主要部件
·中央处理器CPU、存储器和输入/输出设备
·总线结构、指令流和数据流
2.2.5指令系统
·常用的寻址方式
·指令的格式、分类及功能
·指令的执行过程
2.3网络基础知识
2.3.1网络的功能、分类与组成
2.3.2网络协议与标准
2.3.3网络结构与通信
2.3.4网络的安全性
2.3.5Client-Server结构
2.3.6Internet和Intranet初步
C. 要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层的先学精通吗(个人认为)求学长
前言
你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)
建议:
不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。
回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。
一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。
一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。
注:你也许会很奇怪为什么下面的东西很偏Unix/linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:
现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。
越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。
微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《Windows编程革命史》
所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。
启蒙入门
1、 学习一门脚本语言,例如python/Ruby
可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:
处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)
遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量
学会用各种print之类简单粗暴的方式进行调试
学会用Google (phrase, domain, use reader to follow tech blogs)
为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。
2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
Source Insight (或 ctag)
使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。
3、 熟悉Unix/Linux Shell和常见的命令行
如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧
一定要少用少用图形界面。
学会使用man来查看帮助
文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
学会使用一些文本操作命令 sed/awk/grep/tail/less/more …
学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…
了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
了解正则表达式,使用正则表达式来查找文件。
对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。
4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)
未来必然是Web的世界,学习WEB基础的最佳网站是W3School。
学习HTML基本语法
学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)
学会用 Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。
学习使用javascript操纵HTML元件。理解DOM和动态网页(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 网上有免费的章节,足够用了。或参看 DOM 。
学会用 Firefox + Firebug 或 chrome 调试Javascript代码(设置断点,查看变量,性能,控制台等)
在一台机器上配置Apache 或 Nginx
学习php,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。
把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)
跟完一个名校的网络编程课程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php ) 不要觉得需要多于一学期时间,大学生是全职一学期选3-5门课,你业余时间一定可以跟上
学习一个javascript库(例如jQuery 或 ExtJS)+ Ajax (异步读入一个服务器端图片或者数据库内容)+JSON数据格式。
HTTP: The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)
做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)
买个域名,租个空间,做个自己的网站。
进阶加深
1、 C语言和操作系统调用
重新学C语言,理解指针和内存模型,用C语言实现一下各种经典的算法和数据结构。推荐《计算机程序设计艺术》、《算法导论》和《编程珠玑》。
学习(麻省理工免费课程)计算机科学和编程导论
学习(麻省理工免费课程)C语言内存管理
学习Unix/Linux系统调用(Unix高级环境编程),,了解系统层面的东西。
用这些系统知识操作一下文件系统,用户(实现一个可以拷贝目录树的小程序)
用fork/wait/waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。
用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。
学会使用gcc和gdb来编程和调试程序(参看我的《用gdb调试程序》)
学会使用makefile来编译程序。(参看我的《跟我一起写makefile》)
IPC和Socket的东西可以放到高级中来实践。
学习Windows SDK编程(Windows 程序设计 ,MFC程序设计)
写一个窗口,了解WinMain/WinProcere,以及Windows的消息机制。
写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。
学习如何使用MSDN查看相关的SDK函数,各种WM_消息以及一些例程。
这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。
不用太多于精通这些东西,因为GUI正在被Web取代,主要是了解一下Windows 图形界面的编程。@virushuo 说:“ 我觉得GUI确实不那么热门了,但充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识仍然很吃力。或者说移动设备开发必须理解GUI工作,或者在win那边学,或者在mac/iOS上学”。
2、学习Java
Java 的学习主要是看经典的Core Java 《Java 核心技术编程》和《Java编程思想》(有两卷,我仅链了第一卷,足够了,因为Java的图形界面了解就可以了)
学习JDK,学会查阅Java API Doc Java Platform SE 6
了解一下Java这种虚拟机语言和C和Python语言在编译和执行上的差别。从C、Java、Python思考一下“跨平台”这种技术。
学会使用IDE Eclipse,使用Eclipse 编译,调试和开发Java程序。
建一个Tomcat的网站,尝试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小项目试着用JSP和Servlet实现一下。
3、Web的安全与架构
学习HTML5,网上有很多很多教程,以前酷壳也介绍过很多,我在这里就不罗列了。
学习Web开发的安全问题(参考新浪微博被攻击的这个事,以及Ruby的这篇文章)
学习HTTP Server的rewrite机制,Nginx的反向代理机制,fast-cgi(如:PHP-FPM)
学习Web的静态页面缓存技术。
学习Web的异步工作流处理,数据Cache,数据分区,负载均衡,水平扩展的构架。
实践任务:
使用HTML5的canvas 制作一些Web动画。
尝试在前面开发过的那个Web应用中进行SQL注入,JS注入,以及XSS攻击。
把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站
4、学习关系型数据库
你可以安装MSSQLServer或MySQL来学习数据库。
学习教科书里数据库设计的那几个范式,1NF,2NF,3NF,……
学习数据库的存过,触发器,视图,建索引,游标等。
学习SQL语句,明白表连接的各种概念(参看《SQL Join的图示》)
学习如何优化数据库查询(参看《MySQL的优化》)
实践任务:设计一个论坛的数据库,至少满足3NF,使用SQL语句查询本周,本月的最新文章,评论最多的文章,最活跃用户。
5、一些开发工具
学会使用SVN或Git来管理程序版本。
学会使用JUnit来对Java进行单元测试。
学习C语言和Java语言的coding standard 或 coding guideline。(我N年前写过一篇关C语言非常简单的文章——《编程修养》,这样的东西你可以上网查一下,一大堆)。
推荐阅读《代码大全》《重构》《代码整洁之道》
高级深入
1、C++ / Java 和面向对象
我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“C++学习信心图” 和“21天学好C++”
学习(麻省理工免费课程)C++面向对象编程
读我的 “如何学好C++”中所推荐的那些书至少两遍以上(如果你对C++的理解能够深入到像我所写的《C++虚函数表解析》或是《C++对象内存存局(上)(下)》,或是《C/C++返回内部静态成员的陷阱》那就非常不错了)
然后反思为什么C++要干成这样,Java则不是?你一定要学会对比C++和Java的不同。比如,Java中的初始化,垃圾回收,接口,异常,虚函数,等等。
实践任务:
用C++实现一个BigInt,支持128位的整形的加减乘除的操作。
用C++封装一个数据结构的容量,比如hash table。
用C++封装并实现一个智能指针(一定要使用模板)。
《设计模式》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)
实践任务:
使用工厂模式实现一个内存池。
使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。
使用命令模式实现一个命令行计算器,并支持undo和redo。
使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。
学习STL的用法和其设计概念 - 容器,算法,迭代器,函数子。如果可能,请读一下其源码。
实践任务:尝试使用面向对象、STL,设计模式、和WindowsSDK图形编程的各种技能
做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。
学习C++的一些类库的设计,如: MFC(看看候捷老师的《深入浅出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能会太难了,但是如果你能了解其中的设计模式和设计那就太好了,如果你能深入到我写的《STL string类的写时拷贝技术》那就非常不错了,ACE需要很强在的系统知识,参见后面的“加强对系统的了解”)
Java是真正的面向对象的语言,Java的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佳语言了(参看Java中的设计模式)。
推荐阅读《Effective Java》 and 《Java解惑》
学习Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是学习Java的设计,如IoC等。
Java的技术也是烂多,重点学习J2EE架构以及JMS, RMI, 等消息传递和远程调用的技术。
学习使用Java做Web Service (官方教程在这里)
实践任务: 尝试在Spring或Hibernate框架下构建一个有网络的Web Service的远程调用程序,并可以在两个Service中通过JMS传递消息。
C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:
深究C++(我深究C/C++了十来年了)
学习Java的各种设计模式。
2、加强系统了解
重要阅读下面的几本书:
《Unix编程艺术》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。
《Unix网络编程卷1,套接字》这是一本看完你就明白网络编程的书。重要注意TCP、UDP,以及多路复用的系统调用select/poll/epoll的差别。
《TCP/IP详解 卷1:协议》- 这是一本看完后你就可以当网络黑客的书。了解以太网的的运作原理,了解TCP/IP的协议,运作原理以及如何TCP的调优。
实践任务:
理解什么是阻塞(同步IO),非阻塞(异步IO),多路复用(select, poll, epoll)的IO技术。
写一个网络聊天程序,有聊天服务器和多个聊天客户端(服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast)。
写一个简易的HTTP服务器。
《Unix网络编程卷2,进程间通信》信号量,管道,共享内存,消息等各种IPC…… 这些技术好像有点老掉牙了,不过还是值得了解。
实践任务:
主要实践各种IPC进程序通信的方法。
尝试写一个管道程序,父子进程通过管道交换数据。
尝试写一个共享内存的程序,两个进程通过共享内存交换一个C的结构体数组。
学习《Windows核心编程》一书。把CreateProcess,Windows线程、线程调度、线程同步(Event, 信号量,互斥量)、异步I/O,内存管理,DLL,这几大块搞精通。
实践任务:使用CreateProcess启动一个记事本或IE,并监控该程序的运行。把前面写过的那个简易的HTTP服务用线程池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事件,或是记录某个窗口的按键。
有了多线程、多进程通信,TCP/IP,套接字,C++和设计模式的基本,你可以研究一下ACE了。使用ACE重写上述的聊天程序和HTTP服务器(带线程池)
实践任务:通过以上的所有知识,尝试
写一个服务端给客户端传大文件,要求把100M的带宽用到80%以上。(注意,磁盘I/O和网络I/O可能会很有问题,想一想怎么解决,另外,请注意网络传输最大单元MTU)
了解BT下载的工作原理,用多进程的方式模拟BT下载的原理。
3、系统架构
负载均衡。HASH式的,纯动态式的。(可以到Google学术里搜一些关于负载均衡的文章读读)
多层分布式系统 – 客户端服务结点层、计算结点层、数据cache层,数据层。J2EE是经典的多层结构。
CDN系统 – 就近访问,内容边缘化。
P2P式系统,研究一下BT和电驴的算法。比如:DHT算法。
服务器备份,双机备份系统(Live-Standby和Live-Live系统),两台机器如何通过心跳监测对方?集群主结点备份。
虚拟化技术,使用这个技术,可以把操作系统当应用程序一下切换或重新配置和部署。
学习Thrift,二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。
学习Hadoop。Hadoop框架中最核心的设计就是:MapRece和HDFS。MapRece的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapRece就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。
了解NoSQL数据库(有人说可能是一个过渡炒作的技术),不过因为超大规模以及高并发的纯动态型网站日渐成为主流,而SNS类网站在数据存取过程中有着实时性等刚性需求,这使得目前NoSQL数据库慢慢成了人们所关注的焦点,并大有成为取代关系型数据库而成为未来主流数据存储模式的趋势。当前NoSQL数据库很多,大部分都是开源的,其中比较知名的有:MemcacheDB、Redis、Tokyo Cabinet(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
D. 程序员为什么要加班呢
你好,首先程序员加班是一个常态化状态。加班我们分两种情况,第一公司业务确实比较好,在有限的人员中开发量很大,这个没有办法只能加班;另外一个就是自己负责的模块变化很多,比如bug太多,业务逻辑不严谨等。这样的解决办法是多学习知识来填充自己,下面是部分学习知识点,希望能帮到你。
索引在遍历过程中的次序无定义,即使是数字索引也是这样。(如果想按数字次序遍历表,可以使用数字形式的 for 。)
当在遍历过程中你给表中并不存在的域赋值,next 的行为是未定义的。 然而你可以去修改那些已存在的域。 特别指出,你可以清除一些已存在的域。
如果 t 有元方法 __pairs, 以 t 为参数调用它,并返回其返回的前三个值。
否则,返回三个值:next 函数, 表 t,以及 nil。 因此以下代码
能迭代表 t 中的所有键值对。
参见函数 next 中关于迭代过程中修改表的风险。
传入参数,以 保护模式 调用函数 f 。这意味着 f 中的任何错误不会抛出; 取而代之的是,pcall 会将错误捕获到,并返回一个状态码。 第一个返回值是状态码(一个布尔量), 当没有错误时,其为真。 此时,pcall 同样会在状态码后返回所有调用的结果。 在有错误时,pcall 返回 false 加错误消息。
接收任意数量的参数,并将它们的值打印到 stdout。它用 tostring 函数将每个参数都转换为字符串。 print 不用于做格式化输出。仅作为看一下某个值的快捷方式。 多用于调试。 完整的对输出的控制
在不触发任何元方法的情况下 检查 v1 是否和 v2 相等。返回一个布尔量。
rawget (table, index)
在不触发任何元方法的情况下 获取 table[index] 的值。table 必须是一张表; index 可以是任何值。
rawlen (v)
在不触发任何元方法的情况下 返回对象 v 的长度。v 可以是表或字符串。 它返回一个整数。
rawset (table, index, value)
在不触发任何元方法的情况下 将 table[index] 设为 value。table 必须是一张表, index 可以是 nil 与 NaN 之外的任何值。 value 可以是任何 Lua 值。
这个函数返回 table。
如果 index 是个数字, 那么返回参数中第 index 个之后的部分;负的数字会从后向前索引(-1 指最后一个参数)。 否则,index 必须是字符串 "#", 此时 select 返回参数的个数
希望能帮到你,谢谢!
E. 黑马程序员是否是骗局
看到你这个问题,我作为刚刚9月份毕业的web移动前端开发的人来说一下这个情况。
第一,关于是否在黑马这边学习,我建议,如果你个人的自制能力挺强的,那么,你可以不用去黑马学习,自己自学也是可以的。如果你自己自制能力差,但是又想学习,可以去学习,毕竟一个班级这么多人一起学习,学习的氛围还是有的。
第二,关于成本。黑马的移动web开发这边差不多要2w,我是个女生,住的是4人间,住宿费一个月600多,宿舍里的小姐姐都很节省,省电。食堂里的菜有贵的有便宜的,就看你吃什么的了。 一般我都是一个素菜一份米就够了。一般的整个的一个月下来费用差不多是1500左右,共计9000,然后就是所有的生活用品3000也算多的,没有那么多的生活用品。 其实,我只想说一句话,怎么节省怎么来,学习的,不是去享受的。就这样。
第三,关于教学质量。我现在上班之后,我也明白,在学校里面很多的东西就是交给你基础,把你领进门,不可能到公司之后,立即就很厉害的那种。我是直接找的没有要很多经验的那种,慢慢的磨炼自己的技术。同时,如果你在技术上有问题,如果之前你加了老师的微信,你可以咨询老师,老师是回回答你的,尽力帮你解决。
第四,关于就业。就业这方面,我感觉老师的建议是一方面,你自己的想法也是一方面,首先一开始的12k,15k 或者更高的20k,这方面你是要有真的技术水平的。但是,我个人更倾向于稳扎稳打。再慢慢的磨砺半年左右的时间。
最后,还是那句话,你如果真的去学习,就别心浮气躁,沉下心来好好学,别半途而废。我们班一个初中没毕业的,但是依然学到了最后,虽然我并不知道他到最后的工作怎样,但是我知道的是,每天早上我去的时候,他都在那里开始敲昨天的代码了。晚上十点放学,他差不多得到11点锁门才走。所以,你是否有这种学习的毅力。不多说了,希望我的回答对你有所帮助吧。
F. 程序员的工资待遇怎么样
我接触过的程序员,月薪从3K到100K的都有,平均大概在10K左右。
不过,题主,你真的喜欢这行么?
如果仅仅是为了待遇和福利这种功利的目的的话,请读金融或者别的专业吧,反正你都不爱,还不如选个更有钱的专业。
如果不是真心喜欢这个行业,你会很煎熬很痛苦。
我从会撸之前就开始写代码了,虽然天赋不好,也一直坚持到了现在,这十几年来,看到了太多天才庸才蠢才在这行的进进出出。
刚开始学编程的时候,我大概有100多个同伴,但是到高三的时候,就剩下4个人。
他们刚开始进来的理由无非是【好玩】【觉得这个很酷】【我聪明我应该学这个】【学这个高考可以加分】
退出来的理由无非是【太累】【功课压力大】【无聊】【像我这种智商应该参加数学竞赛】【竞赛竞争激烈,高考加那点分还不如我好好学习其他学科来得重要】
他们其中相当多的一部分的智商和能力都能碾压我,但是我一直默默地看着他们风火流星地进来,毫不费力地碾压我一番,又十万火急地退出去,而我在后面,慢慢地走着,冷眼地看着。
后来我上大学了,我还是义无返顾地选了计算机专业。
那个时候,IT业已经开始火了起来,挺过了2002年互联网寒潮的各种互联网老板创业成功的鸡汤故事充斥着整个中国。我的同学选这个专业的理由跟我中学时候学编程的同伴差不多,还加上了【这行赚得多!】这个非常有说服力的理由,题主你看,这就是你现在所在的人生路口。
第一学期,有人就退学回去复读了,次年考上了全国top4的大学,退学的原因是不喜欢这个专业。
在接下来的4年,有相当一部分人过得很痛苦,他们智商很高,在高数上这种纯粹拼智商的科目上碾压来碾压去,但是他们做专业课的作业的时候异常痛苦——因为他们不喜欢代码,但每个要写至少500行代码,平均每行代码有一个BUG,平均每个BUG要查一小时的大作业对于他们来说无疑是酷刑。他们最后只好跟我交换作业抄——我抄他们的数学物理,他们抄我的代码。
但是这不阻碍他们在绩点上傲视群雄,春风得意,包揽各种奖学金。
顺便说一下,我的绩点大约排在全级的75%左右。
大二的时候又有个同学转去建筑系。大四找工作之际他带着铅笔三角尺回来找我们叙旧,眉飞色舞地讲述他当年刚转专业为了追进度连夜画马桶的三视图到鸡鸣、实习的时候在工地上跟工人一起晒了一个月太阳结果被校新闻部当非洲来的交换生采访的轶事。
我说,哈哈,后悔了吧?
他连连摆手,说, 不不不,我宁可去晒成非洲难民也不要看一堆密密麻麻的字符。你不知道,我当初做大作业的时候多么的痛苦。
毕业了,我们专业正儿八经的当程序员的不多,大多数都做了相关的类似测试工程师、策划之类的支撑职业,还有一部分脱离了互联网,回到传统行业去了。
当然他们都过得很好,只是他们用了四年才发现,他们不喜欢这行。
后来我当了一名资质平庸的程序员,同事都很流弊,就像知乎上某个回答【你知道有些轮胎之大,其花纹根本碾压不到蚂蚁。】。
后来我发现我身边一些测试工程师,策划都是毕业于国内TOP3的大学的研究生,甚至是博士,我甚至在我国某个很流弊的项目里看到他们在大学时候留下的痕迹。
我感到很吃惊,说句不好听的,我一直觉得这些职位上的人都是写代码不足,看代码有余的半瓶水乱晃的货,而眼前这批人,从他们过往的项目来说,无论学历、能力或者经验,都完爆我几条街,为什么他们没有顺理成章地成为程序员?
有一天我鼓足勇气问了一个清华博士毕业的测试工程师这个问题。
他叹了口气说,我觉得我这辈子的代码都在大学的时候写完了,现在这份工作虽然比写代码待遇差一点,但是至少不用写代码了。你不知道哎,我现在看到代码就暴躁。
当然,这不妨碍他3年买车,5年买房,而我现在还在凑首付。
我的故事暂时到这里了,我想告诉题主,如果你不是发至内心地喜欢这个行业,你很难坚持下来的。也许你能坚持四年、六年半、十年,但是你坚持不了一辈子。
顺便说一下,我坚持下来的理由很简单:我小学的时候玩了仙剑奇侠传,觉得很流弊,我长大之后也要做一款同样流弊的游戏。
然后我现在在某游戏公司工作。
最后,附赠小故事一则:
从前,在除夕吃年饭的时候,一家人问4岁大的宝宝:乖乖,你长大之后想当什么?
宝宝含着指头,歪着头想了一会,说,我想当医生。
一家人哈哈大笑。
爷爷说,当医生好,地位高。
奶奶说,当医生好,一家人都身体健康。
爸爸说,当医生好,收入高。
妈妈说,当医生好,容易找对象。
姐姐问,你为什么想当医生呀?
宝宝说,因为可以治病救人呀。
G. 一个好的程序员至少应该具备哪些条件
楼上的几位显然误会我的意思了,我并不是说不应当写文档加注释注重团队精神,看看下面的一篇文章,那位三天就写出UNIX的他需要写文档注释和团队精神吗,他用不着。哪个高手没有一点傲气和自信,他之所以敢对用户说:拿到你想要的,然后滚蛋,你已经很幸运了!是因为他有这个资本。天才本就不循规蹈矩,那样他就不叫天才了。
MIT BBS上说微软电话面试的一道题就是“Who do you think is the best coder,
and why?”。我觉得挺有意思的,也来凑个热闹。排名不分先后。
Bill Joy, 前任Sun的首席科学家,当年在Berkeley时主持开发了最早版本的BSD。他还
是vi和csh的作者。当然,Csh Programming Considered Harmful 是另一个话题乐。据
说他想看看自己能不能写个操作系统,就在三天里写了个自己的Unix, 也就是BSD的前
身。当然是传说了,但足见他的功力。另一个传说是,1980年初的时候,DARPA让BBN在
Berkley Unix里加上BBN开发的TCP/IP代码。但当时还是研究生的B伯伯怒了,拒绝把BBN
TCP/IP加入BSD,因为他觉得BBN的TCP/IP写得不好。于是B伯伯出手了,端的是一箭封
喉,很快就写出了高性能的伯克利版TCP/IP。当时 BBN和DARPA签了巨额合同开发TCP/IP
Stack,谁知他们的代码还不如一个研究生的好。于是他们开会。只见当时B伯伯穿
个T-shirt出现在会议室(当时穿T-shirt不象现在,还是相当散漫的哈)。只见BBN问:你
怎么写出来的?而B伯伯答:简单,你读协议,然后编程就行了。最令偶晕倒的是,B伯
伯硕士毕业后决定到工业界发展,于是就到了当时只有一间办公室的Sun, 然后他就把
Sparc设计出来乐。。。象这种软硬通吃的牛人,想不佩服都不行的说。据Bill Joy的同
事说,一般开会的时候B伯伯总是拿一堆杂志漫不经心地读。但往往在关键之处,B伯伯
发言,直切要害,提出漂亮的构想,让同事们彻底崩溃。对了,他还是Java Spec和JINI
的主要作者之一。
John Carmack,ID Software的founder和Lead Programmer。上个月和一个搞图形的师兄
聊天,他竟然不知道John Carmack, 也让偶大大地晕了一把。不过也许搞研究的和搞实
战的多少有些隔吧。想必喜欢第一人称射击游戏的都知道J哥哥。90年代初只要能在PC
上搞个小动画都能让人惊叹一番的时候,J哥哥就推出了石破天惊的Castle Wolfstein,
然后再接再励,doom, doomII, Quake...每次都把3-D技术推到极限。J哥哥的简历上说
自己的专长是"Exhaust 3-D technology",真是牛人之言不我欺的说。做J哥哥这样的人
是很幸福的,因为各大图形卡厂家一有了新产品就要向他“进贡"
,不然如果他的游戏不支持哪种卡,哪种卡基本就会夭折乐。当初MS的Direct3D也得听
取他的意见,修改了不少API。当然,J哥哥在结婚前十数年如一日地每天编程14小时以
上,也是偶们凡人望尘莫及的。对了,J哥哥高中肆业(?),可以说是自学成才。不过
呢,谁要用这个例子来为自己学习不好辩护,就大错特错了。那 Leonardo Da Vinci还
是自学成才呢(人是私生子,不能上学)。普通人和天才还是有区别的。对了,其实偶们
叫“达分奇”是相当不对的,因为Vinci是地名,而Da Vinci就是从Vinci来的人的意
思。换句话说,Leonardo Da Vinci就是“从Vinci来的Leonardo”的意思。叫别
人“Da Vinci”就不知所谓乐。嗯,扯远了,打住。
David Cutler,VMS和Windows NT的首席设计师,去微软前号称硅谷最牛的kernel开发
员。当初他和他的手下在微软一周内把一个具备基本功能的bootable kernel写出来,然
后说:“who can't write an OS in a week?",也是牛气冲天的说。顺便说一句,D爷
爷到NT3.5时,管理1500名开发员,自己还兼做设计和编程,不改coder本色啊。
D爷爷天生脾气火爆,和人争论时喜欢双手猛击桌子以壮声势。 日常交谈fuck不离口。
他面试秘书时必问:"what do you think of the word 'fuck'?" ,让无数美女刹羽而
归。终于有一天,一个同样火爆的女面对这个问题脱口而出:"That's my favorite
word"。于是她被录取乐,为D爷爷工作到NT3.5发布。
Don Knuth。高爷爷其实用不着偶多说。学编程的不知道他就好像学物理的不知道牛顿,
学数学的不知道欧拉,学音乐的不知道莫扎特,学Delphi的不知到 Anders Hejlsberg,
或者学Linux不知道Linus Torvalds一样,不可原谅啊。为了让文章完整,就再罗唆几句
吧。高爷爷本科时就开始给行行色色的公司写各种稀奇古怪的编译器挣外快了。他卖给别
人时收一两千美元,那些公司拿了code,加工一下卖出去就是上万上十万。不过也没见高
爷爷不爽过,学者本色的说。想想那可是60年代初啊,高爷爷写编译器写多了,顺带就搞
出了个 Attribute Grammar和LR(k),大大地造福后人啊。至于高爷爷在CalTech的编程比
赛(有Alan Kay得众多高高手参加)总是第一,写的Tex到86年就code freeze,还附带2^n
美分奖励等等都是耳熟能详的,偶就不饶舌乐。
顺便说一下,高老大爷是无可争议的写作高手。他给Concrete Mathematics 写的前言可
谓字字铿锵,堪为前言的典范。他的技术文章也是一绝,文风细致,解释精当,而且没
有学究气,不失轻快跳脱。记得几年前读Concrete Mathemathics,时不时开怀大笑,让
老妈极其郁闷,觉得我nerdy到家,不可救药。其实呢,子非鱼,安知鱼之乐,更不知那
完全是高爷爷的功劳。说到写作高手,不能不提Stephen A. Cook。他的文章当年就被我
们的写作老师极力推荐,号称典雅文风的样本。库爷爷一头银发,身材颀长,总是面带
谦和的微笑,颇有仙风道骨,正好和他的仙文相配的说。
高爷爷其实还是开源运动的先驱。虽然他没有象Richard Stallman那样八方奔走,但他
捐献了好多作品,都可以在网上看到,比如着名的Mathematical Writing,MMIXWare,
The Tex Book等,更不用说足以让他流芳百世的Tex乐。
Ken Thompson,C语言前身B语言的作者,Unix的发明人之一(另一个是Dennis M. Riche
老大,被尊为DMR),Belle(一个厉害的国际象棋程序)的作者之一, 操作系统Plan 9的主
要作者(另一个是大牛人Rob Pike,
前不久被google挖走了)。Ken爷爷也算是计算机历史上开天辟地的人物了。1969年还是
计算机史前时代,普通人都认为只有大型机才能运行通用的操作系统,小型机只有高山
仰止的份儿。至于用高级语言来写操作系统,更是笑谈。Ken爷爷自然不是池中物,于是
他和DMR怒了,在1969年到1970间用汇编在PDP-7上写出了UNIX的第一个版本。他们并不
知道,一场轰轰烈烈的UNIX传奇由此拉开了序幕。Ken爷爷在1971年又把Unix用C重写,
于是C在随后20年成就了不知多少豪杰的梦想和光荣。
Ken爷爷还有段佳话: 装了UNIX的PDP-11最早被安装在Bell Lab里供大家日常使用。很
快大家就发现Ken爷爷总能进入他们的帐户,获得最高权限。Bell
Lab里的科学家都心比天高,当然被搞得郁闷无比。于是有高手怒了,跳出来分析了UNIX
代码,找到后门,修改代码,然后重新编译了整个UNIX。就在大家都以为“这个世界清
净了”的时候,他们发现Ken爷爷还是轻而易举地拿到他们的帐户权限,百思不解后,只
好继续郁闷。谁知道这一郁闷,就郁闷了14年,直到Ken爷爷道出个中缘由。原来,代码
里的确有后门,但后门不在Unix代码里,而在编译Unix代码的C编译器里。每次C编译器
编译UNIX的代码,就自动生成后门代码。而整个Bell Lab的人,都是用Ken爷爷的C编译
器。
(6)Rob Pike, AT&T Bell Lab前Member of Technical Staff ,现在google研究操作系
统 。罗伯伯是Unix的先驱,是贝尔实验室最早和Ken Thompson以及Dennis M. Ritche开
发 Unix的猛人,UTF-8的设计人。他还在美国名嘴David
Letterman的晚间节目上露了一小脸,一脸憨厚地帮一胖子吹牛搞怪。让偶佩服不已的
是,罗伯伯还是1980年奥运会射箭的银牌得主。他还是个颇为厉害的业余天文学家,设
计的珈玛射线望远镜差点被NASA用在航天飞机上。他还是两本经典,The Unix
Programming Environment 和 The Practice of Programming 的作者之一。如果初学者
想在编程方面精益求精,实在该好好读读这两本书。它们都有中文版的说。罗伯伯还写
出了Unix下第一个基于位图的窗口系统,并且是着名的blit终端的作者。当然了,罗伯
伯还是号称锐意革新的操作系统,Plan9,的主要作者。可惜的是,Plan9并没有引起多
少人的注意。罗伯伯一怒之下,写出了振聋发聩的雄文 Systems Software Research is
Irrelevant,痛斥当下系统开发的不思进取,固步自封的弊病。虽然这篇文章是罗伯伯
含忿出手,颇有偏激之词,但确实道出了系统开发的无奈:开发周期越来越长,代价越
来越大,用户被统一到少数几个系统上,结果越来越多的活动是测量和修补,而真正的
革新越来越少。
就在罗伯伯郁闷之极的时候,google登门求贤来乐。如果说现在还有一家大众公司在不
遗余力地把系统开发推向极致的话,也就是google乐。随便看看google的成果就知道
了。具有超强容错和负载平衡能力的分布式文件系统GFS
(现在能够用100,000台廉价PC搭起一个巨型分布系统,并且高效便宜地进行管理的系统
也不多哈),大规模机器学习系统(拼写检查,广告匹配,拼音搜寻。。。哪个都很牛的
说),更不用说处理海量并行计算的各式google服务了。Rob在System Software
Research is Irrelevant里萧瑟地说现在没有人再关心系统研究的前沿成果了。想不到
他错了,应为google关心。google网络了大批功成总是试图吸取系统研究的最新成果。
想必Rob Pike在google很幸福。愿他做出更棒的系统。
Dennis M. Ritchie, 既然Ken Thompson是我的偶像,新闻组上人称DMR的Dennis M.
Ritchie自然也是,毕竟两人共同缔造了UNIX,而Dennis几乎独力把C搞大(当然,C的前
身是B,而B是Ken Thompson一手做出来的)。两人1983年分享图灵奖,是有史以来少数几
个因工程项目得奖的工程师(本来是唯一的一对儿,但Alan Kay才因为SmallTalk得奖,
所以就成了唯二的乐) 一个人一生能做出一个卓越的系统已经不易,DMR的C和UNIX长盛
不衰近30年,至今生机勃勃,DMR此生可以无憾的说。
D爷爷也算有家学渊源:他老爸在AT&T贝尔实验室工作了一辈子,并在电路设计方面卓有
成就,还出了本颇有影响的书The Design of Switching Circuits,据说在交换理论和
逻辑设计方面有独到的论述。当然,D爷爷和他老爸是不同时代的人:他老爸的研究成
形于晶体管发明之前,而D爷爷的工作离了晶体管就玩儿不转乐。:-D
不要看D爷爷搞出了C,其实他最爱的编程语言是Alef,在Plan9上运行,支持并行编程。
Alef的语法和C相似,但数据类型和执行方式都和C大大不同。说到语言,D爷爷对后来
人有非常中肯的建议:抱着学习的目的来开发你自己的语言,不要冀望于它被众人接
受。这个建议不光对语言开发有用,也适用于其它大型系统的开发。别的不说,DMR后来
领导自己的团队在1995年和1996分别推出了Plan9和Inferno操作系统,又用多少人知道
呢?其实,D爷爷当初也没想过C会风行世界。他开发C的初衷和Eric S. Raymond
在Cathedral and Bazaar里阐述的一样,就是要消除自己对现有工具的不爽之处。谁
知D爷爷无心插柳,C竟然受到众多程序员的狂热拥戴,连D爷爷自己都大惑不解。在一次
采访中D爷爷说大概那是因为C的抽象程度碰巧既满足了程序员的要求, 又容易实现。当
然C一度是Unix上的通用语言也是原因。但不管怎么说,D爷爷对编程语言出色的审美意
识奠定了C广为流传的基础。
最后八卦一下。D爷爷的业余爱好和NBA大牛Karl Malone一样:开卡车。不过D爷爷更喜
欢开NASCAR,而KM独爱巨无霸。J D爷爷自称心中不供偶像,如果一定要说一个,那就
是Ken Thompson了。现在Ken爷爷退休当飞机教练去了,而D爷爷当了贝尔实验室系统开
发部的头,整日忙于开支票。他俩合作20年,屡屡创造历史。这段令人神往的佳话,也
就长留你我心中乐。
P.S., 很多人都以为Brian W. Kernighan是C的作者。其实BWK只是写了那本经典K&R C。
据D爷爷说,他,Ken, 和Kernighan三人中,Kernighan最能写文章,他次之,而Ken写
得最少;但说到编程,Ken爷爷才是当之无愧的老大。
Edsger Wybe Dijkstra, 对,就是E.W. Dijkstra. 一提到EWD,很多人就会想起找最短
路径的Dijkstra Algorithm,就好像一提到Sir. Tony Hoare,就想起Quick Sort一样。
其实这些个算法不过是两个牛人在他们职业生涯中最琐碎的贡献。比如Dijkstra算法,
无非是戴爷爷在1956年为了展示新计算机
ARMAC的计算能力,初试身手的成果,属于他的算法处女作。据戴爷爷自述,他搞出最
短路径算法的时候连纸笔都没用。当时他和他老婆在阿姆斯特丹一家咖啡厅的阳台上晒
太阳喝咖啡,突然就把这个算法想出来乐。而且当时的算法研究还比较原始,牛人们忙
着用计算机搞数值计算,对离散算法不屑一顾。那时连一个象样的专注于离散算法的专
业期刊都没有。戴爷爷于是推迟发表这个算法。直到1959年,他才把这个算法发表
在Numerische Mathematik的创刊号上,权为捧场。:-)
EWD在多个领域牛气冲天,端的是理论和编程两手硬的高手。只不过他的很多工作比较
深刻,学校的老先生们觉得本科生接受不了,不给本科生讲而已。
戴爷爷大概因为最短路径算法一战成名,于是有人请他参加另一台计算机X1的设计工
作,并且把设计实时中断系统的任务派给了他。现在看来实时中断也许不算什么,但要
知到,X1前根本就没有实时中断的概念。实现它简直就是一场豪赌。戴爷爷起初还不情
愿,但经不住项目负责人Bram和Carel的轮番 “吹捧”:我们知道实时中断让您工作变
得非常困难,但象您这样的牛人肯定能做出来的说。结果戴爷爷被糖衣炮弹彻底击穿,
接下了这个烫手山芋。两三年后,他不仅搞出了实时中断,还围绕这个写出了自己的博
士论文,顺利戴上博士帽。
让戴爷爷真正成名立万的还是在X1上开发的Algo60,最早的高级语言之一。戴爷爷没日
没夜地工作了8个月,就搞出了Algo60,也因此获得了 1972年的图灵奖。因为Algo60,
戴爷爷发表了一篇石破天惊的文章:Recursive
Programming,于是人们才知道,原来高级语言也可以高效地实现递归,原来从此以后,
所有程序员都不可避免地和戴爷爷发明的一个词(应该说是概念)打交道:堆栈。
而且Algo60还让戴爷爷深入地思考多道程序设计的问题,最终发明了每个系统程序员
都绕不开的概念:semaphore。当然,戴爷爷总是把他发明的概念严格形式化,极具科
学家本色的说。和这些成就想比,他提出的吃饭的哲学家问题,也就没什么好说的了。
说来好笑,当时的大学(忘了哪所了)还是觉得戴爷爷没有受过正统的数学训练,也不是
专门搞数值分析的,所以最后不太情愿地给了他一个教职。这种小挫折并不能妨碍象戴
爷爷这样的牛人创造历史。他一边教数值分析(:-D) ,一边开始开发一个新的操作系
统,并培养计算机科学家。几年后,THE Multiprogramming
System横空出世。THE是第一个支持松散耦合,显式同步的进程并由此使得严格证明系统
没有死锁变得容易的操作系统。可惜戴爷爷任职的系不识货,还强行解散了他的研究小
组(1972年戴爷爷给他的系主任说他得了图灵奖,系主任的第一反应是你们搞计算机就
喜欢乱发奖)。这让戴爷爷相当郁闷,得了抑郁症。在极度郁闷之中,戴爷爷决定用写作
来治疗自己的抑郁症。于是经典就诞生乐:Notes on Structured Programming。戴爷爷
从此被尊为结构化编程的奠基人,而且他的抑郁症也被治好乐。
EWD太牛,结果他的故事也太多。先到这里吧。1973起,他的故事就在美国发生了。
Anders Hejlsberg,微软.NET的首席架构师,编程语言设计和实现的顶尖高手。他一手
做出了 Turbo Pascal, 也是Delphi, J++(尤其是WFC),C#, 和.NET的主要作者。这些作
品的名字足以为他立传。作为一个程序员,我在这样的大师面前实在无语。生子当
如Anders的说。李维的<>里已详细讲述了Anders的传奇故事,我就不用费舌了:
http: //java.mblogger.cn/iexploiter/posts/1505.aspx
Artima上有Anders谈C#的系列访谈。MSDN上有一段Anders导游的录像 。有兴趣可以去看
看牛人的丰采。