⑴ 要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层的先学精通吗(个人认为)求学长
前言
你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)
建议:
不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少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等。
⑵ 外包公司到底要不要去
一般情况下,我不建议大家选择去外包公司,因为从各个方面综合比较,外包公司都是不利于我们发展的。
但是外包公司的存在又是大多数,我们应该怎么选择,我的建议是,根据自身情况做“符合事实的选择”,如果我们找了很久的工作都没有拿到一份满意的offer,无论是心理还是身体上都承受不住这种煎熬,那么我们可以暂且先在外包公司进行工作,从而积累工作经验,等到时机继续寻找符合自己的满意公司。
但是在外包公司工作一定不要超过两年,要提前去策划自己如何跳出这个环境,从而找到更加有发展潜力的平台进行学习和发展。这些都是需要自己去运营的。在整个过程中,“学习”是主要改变的方式,通过巩固和学习技术与知识,我们可以增加自身的竞争力,毕竟我们还是做的技术行业,还是要用自身的技术能力来说话。
⑶ 程序员有发展吗,java程序员的最终归宿是什么
中学政治学科的课堂上,辩证唯物主义告诉我们,任何事物都包含着既对立又统一的两个方面。要如实的反映事物的本来面目,就必须坚持一分为二的矛盾分析法,对矛盾作全面的分析要运用两分法、两点论去认识事务的本质。简单的意思就是,万事万物都要看到它好的一面和不好的一面。
IT也是如此,程序员的职业也是如此。“程序员的最后归宿是什么!”、“程序员为什么到了30或35就会想要转行”、“边缘化的IT人”等等诸如此类的话题漫天遍野,“程序员吃的就是口青春饭”如一根刺隐隐的扎在了程序员心头肉上。这已成为程序员们深思的职业规划问题。
搜了搜论坛里相关的帖子,仔细看看热心的网友们的讨论,不难发现大家各自的论证都集中“转行”与“不转行”这两个对立的观点上,大家谈到了很多,有关于软件行业这个大背景的讨论,也有关于职业规划与个人现实状况相结合的讨论、更有转了行的程序员道出了转行后的心境,等等。
一定坚持奋斗在这一行的IT人说,他们认为问题的根本还是在个人的心态上。他们表示,实际上程序员是完全可以干一辈子的。国外胡子一大把还干着开发的老外多了去,他们的思维同样活跃,精力充沛,并且还有大量的经验和积累。一行行看似简单的代码之中却蕴含了无数思想,足以体现出其功力,而这也并非一日之力所能。有位网友说,他所在单位隔壁研究所的一位年纪60的工作人员,他的程序思维还是很不错。
IT人确实很累又辛苦,但是真正熬过几年coding日子的程序员,到哪里又不受欢迎呢?可以选择去外资、大型企业作高级工程师,待遇又好,工作也不会像最初做底层开发时那么得忙。也可以选择取中小型企业,做技术经理、研发主管。敢闯一点的,在技术、管理、人脉积累到一定的程度的时候,更可以出来创业。又或者在家作soho一族,承接外包项目也未尝不可。实际上这个行业正在不断地创新中,因此机会也还是很多。
有网友毫不客气的指出,矛盾在转与不转行中的人,其实就是个人能力的心虚。
城外的人想进城,城内的人想出城,很多其他行业的人还很羡慕IT这个行业,IT之外其他行业的苦楚也并非我们能够想象。
生活中的压力,买房子买车,偿还贷款,赡养老人,结婚生子等等,这对任何一个行业的现代人来说都是一个要处理的问题。并非只存在于IT这个行业的从业人员中。计算机行业并非那么的苦不堪言,IT一族虽然挣钱不会太多,相对来说算是比较稳定的,不会太穷。
任何一个行业,想要有更长远的发展,前进的动力就在于由被动到主动,主动去工作,主动去学习,主动去寻找这个行业中的其他道路,认认真真将这个行业捉摸透,只要做到积极与主动,推动职业发展的强而又力的动力就有了,那么职业生涯的道路必然就掌握在自己的手中。
少一些浮躁,沉下心来体会技术的真正精髓,踏踏实实的做,最终会有一个好的归宿。
要在程序中用代码作诗,要做个IT李白。一部分IT人表示一定要做个纯粹的IT人。始终坚持自己的兴趣和理想。继续向软件狂人、顶尖科学家进军!。
另一部分IT人,他们毫无遮掩的指出了一个同样令人发省的问题:现实呢,这个行业确实发展太快,技术的不断更新,随着年龄的上升,体力脑力精力不可能随之快速的适应,不能适应,也就意味着被淘汰,那么那时该怎么办呢?与其这样,不如提早为自己找寻另外一条路,提早认识这一点,算是对自己的负责。
关于转行的观点中也有两个集中点:行业自身与年龄问题。
30或者35岁的IT人为什么要转行,因为生活的关注不同了,有了家庭,不再是单打独斗,有的是更多一份责任的承担。年龄的增长带来了生理上的改变。这是讨论的主要观点之一。
技术的日新月异,各个公司的血液不断换新,企业想要发展依赖于产品,而产品的开发归于技术的支持。新老开发人员的不同在于,老一辈的开发人员在年轻时学的技术在现在应用的很少了,生活上上有老下有小,体力和精力投入的要少,学习新技术的能力比不上年轻人,思路也不灵敏了,逻辑分析能力,理解能力逐步减退,唯剩经验,但是IT届的经验不如创新值钱。
相比较,新一代开发人员对新技术的学习及应用所花的时间要多一些,他们的生理机能也正在上风,他们更多的技术起点也是基于此,他们有的是时间和精力投入其中。大部分企业也认为,招聘年轻的开发人员,他们没有太多生活负担,他们能将更多的时间投入工作中。公司总是希望自己的员工将精力投入到公司的工作中越多越好,至于员工的其他生活呢,公司又会管你多少?
还有IT人表示现在做开发远没有之前那么热情了,随着工作时间的变长,发现当初怀着对技术的崇敬,加入其中,原本以为这是个崇尚技术本身的队伍,但慢慢发现很多技术管理,技术经理他们的技术并非想象中的那么好,依靠着资历换得职位,技术为上的梦想也逐步幻灭。Coding如同打字,代码贴过来,转过去,全成了一种体力上的劳动。积极与热情大大打消了。这也是主动性减少的原因之一。
另外一点就是,国内的软件业形势不好,需求乏力,盗版猖獗,成本提高,规模小,导致了软件业的不景气。在这样的大环境下,前景并非乐观,因此程序员的职业发展也受到了相当大的阻碍。
⑷ 程序员的出路在哪里
【原创】下面四千字的东西,打了三个小时,又花了两小时修改,体会来自于自己的经历。既为楼主也为自己,也希望能给他人带来一点帮助,因为自己也曾苦于出路这个问题许久,徘徊于技术与销售之间。其实,最重要的是,想清楚自己要的到底是什么,而实现的方法有很多,选择其中的一个,然后耐心去做,注意做的过程中,要多方面发展。不断提高自己的综合能力才是硬道理——这才是出路之所在!!!。
【出路】
在职业选择上,很多人都会问一个问题,这个职业有什么出路?想得到正确的回答,必须先搞清楚,自己究竟想得到什么东西。对于程序员这个职业,如果你要的是钱,很多的钱,程序员没有出路;程序员工作繁忙,有时不规律,连续着加班很有可能,如果你要的是休闲的生活,程序员没有出路;程序员都是与电脑打交道,工作就是坐着,如果你要的是跟人广泛的交流,而且坐不住,程序员没有出路;写程序都是很逻辑的东西,如果你不喜欢这种解题式的思考方式,顶不住整天思考所带来的疲惫,程序员没有出路。
程序员跟民工的区别就是,高强度的脑力劳动者和体力劳动者。虽然程序员的待遇看起来还不错,想想其实不是,假如八点半上班,加班到十点,没加班费,平均下来,一个人相当于干了将近一份半的工作,除下来收入付出比就少了半截,收入多是因为付出的劳动多。这是开始做程序员时常有的事。
假如纯往技术上走,干几年熟手了,情况会好,但是,当你对比起干了几年销售的朋友时,你会发现,你的劳动力太廉价了。一个小公司的销售,普普通通干三年后,一年拿十万块的提成是很有可能的,而一个程序员,普普通通干三年,能拿月薪一万的不多。还有人家销售有许多的报销,你有么?如果有天赋而且努力地干,销售,大学毕业三年买车买房的多的是,当然不是说噬老族那些;程序员呢?有多少能!也许研究生,而且读的好的那款还比较可能,但此时那些本科或者大专,甚至中专就出来跑销售的,已经工作好几年了,说不定此时正在三亚晒太阳呢!
你说销售的应酬多,呵呵,喝酒;要去拍人马屁,去求人什么的!ok,这就是销售,你敢保证当你看到他们的收入时,还有看到他们拿着公司的钱,请客户去各种高档的地方消费时,甚至说句不好听的,花公司的钱请客户到处吃喝嫖赌时——客户也是人,许多客户就这些个的爱好,所以要满足他,他才买你的帐,很正常——严格意义上讲,这样的工作比坐在电脑前埋头苦干来的轻松多了,其实是一种享受,看到这些,你敢保证你一点都不眼红?呵呵,如果不眼红,那就专心干程序员吧!
或者说,你对这种“一点科技含量都没有的工作”——在你眼中,高iq的人才是牛b的人,那就安下心来干程序员吧。但我想说,在这个社会上,赚钱最多最快的,最舒服的,永远是销售。当然,干技术干的好的,最终都是比较受人尊重的——专家,当然是五十年如一日投身于技术那种人才能成为专家。如果你能刻苦地干程序员,想成为架构师、系统分析员,成为软件专家,那就专心干程序员吧!
或者说,你实在干不来与人交际,还要挖空心思去维护各种人际关系的工作是,那就安心下来干你的程序员工作吧,就像民工一样,有谁乐意去干民工,但是没办法,能力所限,只能干民工了。但我想说,能力都是学来的,给民工们上大学,他们毕业后一样会有很多牛人。有人说:“哪有那么好的条件给他们上大学啊!”。条件很多时候要自己去创造啊!难道每个成功的人都有一个高人,手把手地拉扯着他,给他良好的成长环境和资源吗?没有什么东西学不来,只是学得快和慢的问题,要真正去学学看才知道,而不是停留在大脑中。如果你学编程学得很快,而且学得很开心,即使学的过程很累,那就专心干程序员吧!
接下来,告诉你一个好消息,史玉柱出身技术、马化腾出身技术、唐骏出身技术、比尔盖茨出身技术、杰克•韦尔奇出身技术,等等,他们都成功了!假如这是你想象中的出路的话。我不是说要达到他们那种水平,而是走技术路线,来获得事业有成,获得成功。写过程序的人都知道,想实现某个功能,有很多种实现方法。获得成功也是一样,有很多的路可走。这就是我为什么拿销售来做比较,每种职业都能到达成功的彼岸,不管是做技术、行政、财务、销售,等等。
出路是什么?不就是人生价值的实现,有的人要的是成就感,有的人要的是幸福,有的人要的是健康,有的人要的是金钱,有的人要的是地位名气,有的人要的是贡献全人类,有的人要的是玩乐、享受,其实这些都是不同人的人生价值。而实现自己人生价值的方法实在太多了,不管从事什么职业,不管是java程序员,c++、c#,都能成功的,最最重要的是想清楚你想得到什么,接下来就是做具体的计划,然后实现计划。实现的过程不能拘泥于技术,应该多方面发展,不断提高自己的综合能力!想做项目经理、做cto,或者用自己的技术去创业,都必须发展自己的综合能力。
回到刚才,马化腾、比尔盖茨、唐骏等等这些技术员为什么能成功?技术过关是基础,甚至技术过硬,唐骏日本、美国留学,比尔盖茨哈佛。接着,最重要的是:超前的眼光。qq其实不是什么很难的技术,比什么量子物理简单多了,而且icq还是以色列人开发的,马化腾就照着开发了qq,当时在中国就是超前的东西;比尔盖茨的windows,让三岁小孩也能使用电脑,而不用记一大堆的dos命令,这就是超前;唐骏发明了卡拉OK评分器、大头贴,你自己可以想象一下大头贴有多少的技术含量,然而它带来的经济效益是多少!所以说,想法太重要了,好的技术不是它有多高深,而是它能给人的生活带来多少的便利,而往往第一个想到的人能获得巨大的回报。第三,人际关系,别老以为做了技术就能以高姿态出现,有人很鄙视销售,认为没技术含量、俗;销售还很鄙视技术呢,穷、死板。其实,没人能靠自己一个人赢得一切,技术要靠销售来卖自己的产品,销售要靠技术生产产品,谁都离不开谁,这其中还有一连串的其他人呢,财务、行政、前台mm、老板等等。现在越来越提倡团队合作,跟队友、跟上级、跟客户之间的沟通是必修课,沟通不好必然配合不好,你的才能永远无法施展,何来的出路。
第四,求人,其实求人是人际关系中的一个,为什么单独在这里讲,因为他太重要了。机会很多时候是靠求人得来的,例如唐骏,他去日本留学的机会就是求了一大堆人得来的,他当时考研究生,在北京邮电分数最高,但因为大学没得过一次“三好生”,北邮没给他出国名额。他给各个大学的研究生处打了三天电话,问还有没有留学名额,得到的大多都是这样的回答:“我们自己的学生都不够呢,哪里轮得到你?”,如果脸皮薄,没耐心,早就放弃了,后来他找到了北京广播学院(现在的中国传媒大学,就是陈鲁豫读的那个学校,据说当时很水。。。),吴怀仙老师,当时他们的对话是这样的:
“看你的成绩很好,你们北邮应该取你呀!”
“北邮当然取我。但是,我从小爱看电视爱听广播,未来中国的广播电视事业一定会有很大的发展,为了这项事业,我愿意放弃北邮,来到北广。”
“照你现在的说法,你不是为广播事业而来吗?怎么又跟出国有关?”
“中国的广播事业很落后,需要去国外学习一些先进的理念、先进的技术回来呀!”
“老实说你来有风险,如果教育部不批的话,你不能出国,就必须留在广播学院读书。可是北广没有硕士学位的授予权,你只能取得研究生学历,得不到学位。”
“我来的目的很明确!为了中国的广播事业,有没有学位没那么重要。”
你知道当时的实际情况是怎样的吗,北邮根本就没有给唐骏名额,唐骏根本就是说了一个无伤大雅的谎言,所以,你看看、你看看,善于变通对于一个人的成功是多么的重要,唐骏他们都不是一味地干技术就能成功的,很多时候必须好好包装自己、销售自己的。在这里我不是在说要去骗取利益,而是说,在遇到困难的时候能改变思路,转个弯绕过路障!!求人很重要,有个强硬的后台帮忙,少奋斗十年!后来唐骏又去教育部门口站了几天岗,等人、求人,呵呵,其实只是问了几声好,这是后话。
第五,超越物理层。凡是要获得大的成功,赚大钱,或者说更容易地赚钱的,都不能拘泥于物理层。只有大老板能给你建个实验室,让你搞深层次的技术;而只有你的实验室能不断做出可以卖钱的产品时,你的实验室才不至于被关闭。走入公司的决策层,你才能决定该往那走,什么技术该大力发展、什么技术该好好改造、什么技术该放弃。这个道理相信不用讲你也明白,那么,如何进入决策层,靠高素质、靠综合能力。学习能力、沟通能力、领导能力、管理能力、玩的能力(品酒、打扮、奢侈品、打高尔夫等等),一大堆的能力呢!没有一所学校、一个组织能教授全部,这些都要靠自己去学、去领悟,前提是,你要有去学、去领悟的想法。
说实在的,世界是很复杂的东西,要的是你去适应它,它不会来适应你。唐骏说:“性格能改变吗?很多人说不能。可是我认为,本性是不能改变的,但性格是一定能改变的”。杰克•韦尔奇,通用电气前ceo,打小有自卑心理,到了成年还略带口吃。他母亲激励他,这算不了什么缺陷,只有面对现实,坚持与别人沟通,让别人了解你,才能主宰自己的命运,别人才会跟你做朋友,这是这个伟大而平凡的母亲给予杰克的最大财富。事实上,如果你自己不在意,那么那个缺陷也就不太重要了。略带口吃的毛病并没有阻碍杰克的发展,实际上在后来,注意到这个弱点的人大都对杰克很敬佩,因为他竟能克服这个障碍,在商界出类拔萃。赶紧改变,让自己更好地适应这个复杂多变的世界。
想清楚自己要的是什么,做一个两年计划,因为超过两年变数就太大了,然后制定实现的步骤,也就是一个个短期计划,从第一步开始实现。这些计划应该是具体、可行而且能在预定时间内完成的,最后静下心来,耐心实现自己的每个计划!!不要老是问人,我这样做对吗,我该怎么做。哈佛退学就一定是错的?北大卖猪肉就一定不好?外企就一定是好归宿?你该做的就是,想清楚自己想要什么,金钱、美女、名利、地位、权势,还是过平凡的日子,做善事做好人,都没问题,只要真的是你想要的就好,然后考虑怎么去实现它。其实实现的方法有很多,选择其中的一个,然后耐心去做,注意做的过程中,要多方面发展。不断提高自己的综合能力才是硬道理——这才是出路之所在!!!
⑸ 在国企当程序员是什么体验
乐字节教育 是集线上教育与线下培训于一体的全栈式教育机构,致力于高端IT技术教育,培养高端IT人才,让人人都享有高品质教育是乐字节的教学理念。
2017年初,我通过一整天的笔试及面试加入一家(某一线城市国资委全资控股)某集团的研究机构(中央研究院),任职软件工程师!
在这边工作了整整一年,目前 已经跳槽到一家互联网公司 ,在回头看看这一整年,感受颇深,只好一吐为快,以便对想进入国企的程序员帮助及借鉴。
入职考试
国企面试与其他企业并没有太大区别。
首先是笔试,一般都是前面50道选择题,后面两道是开放性的大题,大题没有固定答案,只要符合社会主义核心价值观就可以拿到满分。
选择题是关键,全部都是技术题,需要答对40题以上,才有可能进入下一轮面试。
面试分三轮, 首轮是程序员面你(你未来的同事) 。
他们会问你一些技术相关问题,例如:选举算法,redis的应用场景,如何处理高并发,如何保证高可用,是否关心Nodejs新发布的版本,deno是什么;诸如此类的问题很多很杂。
第二轮面试是由副院长来面(也就是你未来的直属上司) 。
他会问你项目相关的问题,例如:做过哪些项目,解决了什么问题,你在项目中的角色,项目是如何管理的,又是如何进展的,使用了哪些技术栈,为什么挑选这样的技术栈,遇到哪些问题,如何解决的这些问题。
第三轮面试是由HR来面 。
这个面试就很简单了,简单说一下你的情况,聊聊家常,然后他会向你说明组织结构,与一些待遇问题。
PS:进国企最重要的素质是文凭,我们研究院硕士以上学历人数比本科要多,而且大部分毕业于国内一流院校(交大生是整个研究院的主体)。
入职国企工作
1、工作压力
工作压力还是蛮大的,产品并不像私企由市场导向,而是政策导向;国家说人工智能热,那我们就去做人工智能的项目,说区块链热,我们就去搞区块链的项目,反正我在研究院一年以来,搞过云计算,人工智能,大数据,区块链。
好处就是你能学到很多东西,而且紧跟市场热度。坏处就是什么都会,但是什么都不精。
举个两个例子,我们也开发OCR AI图片识别系统,在市场上已经有很完善的产品,而且很廉价,我们依然花钱去开发这种产品,市场价值基本没有,因为直到目前为止,我们产品的识别率依然不如市场上的几个主流产品(阿里,网络)。
第二个例子,便是私有云,这个我们做得真的还不错,但是市面上最强的是华为,他们是卖服务器送私有云,也就是传统的卖硬件送软件,与他们相比,我们的产品就不具竞争力了。
工作强度真的还好, 一般都不需要加班 ,至少我是不加班的。
这就意味着可以放羊了吗?当然不是!
我加入的项目组,大多都是以2个星期为周期进行开发的,每两个星期要举行一次组内讨论会,如果完不成任务或者bug太多是需要加班处理的,因为国企是不可以出错的,一次出错可能直接招致点名批评(包括这个项目的所有相关人员), 一次KPI黑记录,会直接影响你以后的升迁前途 。
组内都是协同工作,可能因为你的原因导致项目没法按时上线,发生一两次你就会被边缘化,最终要么离职,要么下放到子公司。 就算是副院长级别,如果完成不了集团的KPI,也是会被下放的。
但是相比互联网公司,国企的压力相对小一些,互联网公司实行的是不能胜任就走人的策略,所以每个人几乎都没有什么安全感,只有拼命的工作来争取自己有安全感。
国企,特别是大国企,公司的人事权一般都在公司总部手里。
国企办公环境一般都是比较好的,我们有自己的园区,自己的办公楼,空间很大,硬件配置都是很不错的,有健身器材,有空气净化器,有自己的食堂,有自动售货机。
有自己的产品展厅,有自己的公司纪念馆。
这部分只剩下吐槽了, 一个萝卜一个坑,萝卜不走,也不会让出这个坑 。在国企表现是没有意义的,除了口头表扬,你获得不了任何实际好处。
好的人脉要比努力重要,如果上面没人认识你,就算你的领导大力推荐你,你也不会得到提拔,空降长官在国企是一件司空见惯的事。
PS:组织人员要比群众晋升快(群众进不了总部)。
如果说国企15年前的待遇是一流的,那么 如今的国企待遇最多只能算是二流的,特别是对于IT行业来说。
以我所在公司为例,待遇采用工资+福利(洗漱产品,电影票,接近1500元人民币的补助等)的方式,工资增长比较慢,相对于互联网公司来说,待遇至少是被腰斩的,鄙人也是迫于生活压力,为了生计而离开国企,跳槽去了互联网公司。
吐槽****:****国企没有奖金,国企没有奖金,国企没有奖金 ,重要的事情说三遍。
国企的稳定性应该是最被人人称道的,特别是中字头企业。
一方面是国企的社会责任感几乎不太可能会裁员;另一方面公司的人事权几乎都是在公司总部手中,下面的分部门是没有权利做出裁员决定的。
以研发为例,如果有人不能胜任工作或者和其他人工作合不来,部门领导会想总部申请调岗,调到行政人力或其他部门,不会出现领导向总部申请把你开除的事,所以国企给了员工很大的安全感。
互联网公司则不同,裁员是家常便饭,领导一高兴或一生气甚至一拍脑袋就裁员,经常一年就会裁员几次,员工几乎是没有安全感的。
互联网公司很多都是靠融资生存,一旦融资间隔比较大或融不到资就会裁员,生存的压力巨大,让它们没有能力或者没有职业道德感或无耻去考虑员工的感受。
国企则不同,国企的业务本来波动就很少,国企营收相对稳定,再说也不差钱,没有生存的压力。
实际大部分国企使用的技术一般都是商用的,比如Oracle,SQL server等,极少使用网上的开源框架。
一方面是因为商业软件系统稳定,有大公司做技术支持;另一方便开源软件稳定性有待加强,到了线上因为开源框架的bug导致的系统故障可以说是得不偿失,毕竟对于国企来说不差这些钱。
但是我们不同,我们毕竟是研究院,以研发为主,所以更多地使用开源技术。
PS:国企软件开发版本迭代比较慢,系统测试时间比较长,毕竟对于国企来说,不怕慢,就怕系统出现问题,系统出了问题比系统开发不出来更严重。
⑹ 程序员未来会成为非常内卷式的职业吗
内卷化在我之前已经有18人将其概念阐述了,在此我就不再重复了。
非常即不平常。我个人认为,程序员已经是或将来也是一种职业,正象各种工程师一样,是其中的一个普通的职业而已,所以不存在非常之说。
任何职业到了一定时间都会推陈出新,或者说被前进中的、发展中的经济 社会 淘汰,也是 社会 发展的正常现象。比如,伐木工、个体裁缝师、掏粪工……等等许多职业被 社会 发展淘汰了。
程序员这个职业, 社会 发展到一定阶段,也会停滞不前或无法转化,这也是时代发展的必然结果!谢谢!
1 我对内卷化的理解
网络这样描述内卷化:指一种 社会 或文化模式在某一发展阶段达到一种确定的形式后,便停滞不前或无法转化为另一种高级模式的现象。最早出自美国人类学家吉尔茨(Clifford Geertz)的《农业内卷化——印度尼西亚的生态变化过程》(Agricultural Involution: The Processes of Ecological Change in Indonesia)。
参照网络的定义和网络其它资料对内卷化的解释,我认为程序员的内卷化是指:不断的重复现有的编程工作,无法取得创新性的成绩或推动这一领域的变革,在编程这件事儿上很难再更上一层楼。
2 我对本问题的回答如果将这个问题加一个限定,限定为 中国的程序员 ,答案将会是肯定的。未来30年,程序员不会内卷化。
理由一: 当前美国对我们实施技术封锁,涉及到工业基础的软件基本沦陷,猛一看去,遍地是国外产品。因此,涉及到这些国家工业命脉的基础类软件在未来的几十年内我们都要自立更生,自主开发,等待程序员的挑战还很多,离内卷化还很远很远。
理由二: 结合我自身12年 直升机HUMS系统 的科研经历,我发现我们国内科研人员的编程能力普遍较弱,我自己也包括在内。而有的国外工程师则既是专业领域的大牛,又能将自己的专业知识用程序实现,最终还能成为产品,这种能力不得不服。而我们国内的很多程序员则只会开发程序,对专业又不懂。这就造成了国外同行一个人可以做的事情,我们需要一个小组。这就形成了效率方面明显的反差。
理由三: 未来,纯粹的程序员会越来越少,既精通专业又精通某一程序语言的人会越来越多,也会越来越受欢迎。这样的模式也是国家在未来30年内急迫的需求,只有这样我们在工业基础领域才会以较快的速度诞生越来越多的自主软件,完成Matlab、Solidworks、AutoCAD等软件的替代。另一方面,科学技术的发展是没有止境的,起码对于我们祖国当前的处境来说是这样的,我们离内卷化还很远很远, 科技 是不断进步的, 科技 不会内卷化,那么作为一个科研程序员就也不会内卷化。
第一:目前互联网行业,高级工作不够多,程序员的成长在资本家眼里就不是一项优势,而是成本负担。就会直接导致内卷。
第二:有容易写的程序,也有难写的程序。程序员慢慢积累到能力的巅峰之后退休了,下面的人就得补上来,每个人都有自己的位置。
首先我们要确认什么是程序员
会敲代码的只是coder,俗称码农,那种996,过得非人的生活,堪称“码畜”,毫无生活可言~
会敲代码,有编程思想,有业务理解的见解之人请叫他们“程序员”,programmer
分清楚什么是程序员以后,程序员是不会非常内卷式的职业
即使本人无强烈意愿,但是技术更新的迭代也迫使他们往前走,vb、Delphi、pb的程序员不会该转行的转行,转语言的转语言了。
为了更好的设计程序,必要讨论需求及业务是必要的,如果是完全内卷,工作都完成不了,企业还要ta吗?企业都不要ta了,ta还是程序员吗?
因此程序员为了自己为了利益,必须是不断学习及进步的一群人,中国的 科技 兴国也在这群人身上。
至于coder,不要拿出来侮辱程序员了
对于未来的不确定性,哪个职位不可以被这样质疑呢?
例如现在视频发展越来越火,那么文字工作者会内卷吗?
现在新生人口下降,那么未来教师行业会内卷吗?
......诸如此类。
在我看来,行业充满着不确定, 社会 也存在不确定性。
作为程序员或者想从事程序员的人士,现在考虑的不是将来会不会内卷,而是精进技术,多掌握几门语言。这才是最重要的。
我妈妈在我小时候是名裁缝,那时候学得裁缝这门手艺就可以养活自己乃至家人, 社会 发展至今,工业代替了大部分手工。裁缝这个职业被边缘化,那么,我妈妈饿死了吗?也没有,妈妈不是裁缝之后,选择了去卖衣服,因为做裁缝让她对布料、剪裁等烂熟于心,所以进的货好,生意也好,和我爸爸俩人把一大家子养活得白白胖胖。
所以程序员未来会成为非常内卷是的职业吗?你完全不必要去杞人忧天,做好当下的工作,不断进取,不断学习,这才是成长之道!
未来这个应该有一个限定,比如说10年,20年,30年。30年我不敢去猜测,但是,未来10年内,程序员不可能成为内卷式的职业,相反,随着国外对中国技术的封锁,国内更加需要软件方面的自主创新发展,软件开发环境的改变也会带动整个软件行业发展的大变革,每个程序员的作用也会变得越来越重要,所以,我认为,未来10年,程序员不会成为非常内卷式的职业。
很高兴回答你的问题,我大学学习7年,程序员工作4年了,说一说我对程序员行业的判断。
现在 科技 的发展可以说是一年一个样,作为程序员的我们也在不断的学习新的技术。而人的学习能力和主动性是不一样的,因为这个会将程序员进行划分:
第一类:初级程序员。这类程序员会是it行业建设的中坚力量。主要负责基础软件和系统的基础编码编写工作,随着一些中间件和智能系统的不断呈现,这类编码工作门槛逐渐降低,工资水平也会降低并趋于稳定。
第二类:中级程序员。主要负责一些新技术的预研和攻坚,并结合业务场景搭建一些中台系统,从而降低公司的开发成本。
第三类:高级程序员(技术专家)。这类人专注于某一个领域进行研究,比如计算机视觉、图片语音分析识别等。这类人会创造出很多专利性的技术,帮助公司拓展新领域的业务!
本人资深程序猿一枚,我觉得要判断一个职业是不是内卷式,要从几个方面来分析:
一、职业的依赖工具。还记得 历史 书上说过:能不能使用工具是人和动物的主要区别。比如中国历经5千年的农业一样,农民这一职业高度依赖农具,农业的发展史实际上是农具的发展史,从刀耕火种到使用铁器,再到目前部分发达地区的农业自动化,农具一直在变化,。只要农具向更先进化发展,我们就不能说农民这一职业具有内卷性,实际上几千年来农民一直是向前发展的,而人总要吃粮食,农具(或者农业技术)向前发展是毋庸置疑的。再说程序猿,我们使用的工具就是电脑,相对于农具,电脑这一工具的发展可谓光速,从台式机、到智能手机、各种智能设备都可以归为电脑这一类,可以肯定的是,电脑只会发展,不会消失,而且会进一步影响我们生活,比如物联网、比如AI,只要电脑这一工具发展,程序猿这一职业就不会消失,只会向更高端进化,以适应更高级工具的操作要求。
二、职业人群。众所周知,程序猿无论从学历、知识还是智力在 社会 人群中是属于中等以上的。 社会 的发展,是教育发展的推动,作为普遍的受过高等教育者,最有可能保持开放的思维去接受新的事物,只要能够学习,这一职业只会进化,而不会停滞不前。但是这一过程中,不适应这种发展的部分程序猿会被淘汰,这是毋庸置疑的。
三、 社会 发展趋势。 社会 的发展本质是 社会 生产力的提高。怎么提高 社会 生产力?依赖机器!依赖自动化!就像当下程序猿存在的意义一样,程序猿创造了各种自动化工具,提高了 社会 生产力。只有提高 社会 生产力这一大趋势不变,程序猿就不会停滞不前,只会不断进化。
一开始还不是996 coder,若干年之后才见分支,有的人悟性慢,有的人用心专而已,coder 是最基本的付出,连自己的起点都漠视了的匠人怎么做继承,内卷也不可怕,反射够多就需要内卷式的人才积淀出火花,就算是普通的coder,也是信息世界的基石,不尊重民意和基础的国度在大洋彼岸塌了,就这样开始在信息砖工上开始新的歧视?
学好python大数据分析和机器学习等,就拥有了改变世界的能力,故好的程序员永远有发展前途。
本人预计,随着信息化等技术的发展,市场经济将被计划经济代替,人类将会有更多创造性劳动的时间和休闲的时间。