还记得本身那年考清华失败,被调剂到中科大软院,当初有几个方向能够选,软件设计、嵌入式、信息安全等等,绝不犹豫地选择了信息安全。javascript
为何选信息安全?这四个字听起来多牛多有感受,我本科是学物理的,记得作一个光学实验的时候,一个老师看我作的结果,说,学物理不是什么人均可以的,这个是须要一点智商的。php
好吧,当初其实并不是对我一我的所说,但我确实感受到受到了鄙视,同时,我没有任何在物理上的精湛技艺能够反击个人老师。css
因为整个大学期间,我都在沉迷游戏和小说,以致于辅导员说,如今找你都得预定。html
而个人同窗基本在学期开始和考试前能见到我,当时为了应付考试,我不得不学习复杂的物理公式和推导,有一门课程是激光原理,老师是双博士学位,大概是很厉害的,在我考试时,过来看个人卷子,说你的”背功“很厉害。前端
考试时如期经过,但老师大概都对我评价不高。天然,我是感到不愉快的。java
回到个人毕业论文,大概是作一个电离层特征参量的反演,其实就是用迭代法解病态方程。python
这个论文基本是没有人选的,由于题目自己可能相对比较难,也须要编程实现,好吧,当时下载的是盗版的matlab,参考的是一个日本学者和我导师的论文,铿铿锵锵地写出来了。还作了个所谓的参数优化,以使得结果看起来更平滑。mysql
当时以为很得意,我女友(如今的老婆)也很惊讶,我一个月作完了。linux
其实这不是第一次领略程序的魅力,在好久以前,高中时期,为了追一个女生,我作过flash,当时我就以为拖来拖去很麻烦,但苦于没有基础,看不懂 actionscript,因此难以深刻体会编程的精妙,若是看到网上有一些相似雪花飘落、旋转字等效果,都是直接拷贝修改到完工。c++
如今回到,为何选择信息安全上来,由于在大学时,很喜好游戏,尤爱单机,国情你们是清楚的,并且我没有钱,也不知道哪里能够买到正版,这个猥琐了,呵呵。
仙剑、上古、火炬之光、火焰纹章,各类类型都喜欢。也很喜欢生存类游戏。给一个单机游戏作的exe补丁和用lua拓展的mod至今看来仍让我怀念。
讨厌网游是由于本身没有钱,搞不过RMB玩家,并且砸装备总失败。
惟独一个,2006年时,我玩完美世界,后来玩它的SF,为了砸装备,我 第一次想到写封包外挂,因为当时已经有一些socket、tcp/ip的概念了,虽然C++玩不转,仍是各类参考,写hook、写字节转换,同时完美当时 打击WG很厉害,游戏基址容易变,又加了不少防调试的功能。
但为了避免手工砸装备(SF里的石头几乎免费,就是砸上去的概率过低),我欲望那个强啊,因此用OD调试找网络发送的函数地址, 而后C++写代码hook。
程序最终工做很好,我还分享给了几个玩友。
后面也写过一些相似跳舞自动击键的WG,主要也是为了自娱自乐,由于我真的反应不过来屏幕上瞬间出现太多的key!
与程序为伍的日子不多,但每一次接触,彷佛都是为了达到本身的一些目标。
因此凌乱的编程体验,虽然不系统,不精湛,却让我快乐。
再次回到为何选择信息安全上来?也许答案已经很清楚。
当时以为虚拟机加密过高深了,联网解密也难搞定,因此以为信息安全必定是能解决个人问题的!
后来你猜到了,就是C,就是汇编,就是linux,我当时是多么反感linux,当时还用的是ubuntu,但为了课程,实在是没有办法,为了考 研,本身系统自学了数据结构、计算机网络、操做系统、组成原理,当时在考研论坛上还和一个清华搞计算机体系的探讨问题,刷了好几页的帖子,如今看来,多幼 稚!但,快乐也是固定在那个过程之中了。
我讨厌汇编,我讨厌C,我讨厌linux,但他们强大,可以知足需求,这就够了。
其实这不该该是咱们真正的主题,并且入了行的也不多会java仍是c#这么比,但初学的,java和c#每每就表明了两大流派,java代替了j2ee,c#代替了.net,ok,没有关系,这么做为title,不影响咱们说事。
若是从语言的角度上来说,c#毫无疑问胜出,易用、门槛低、优雅、较为简洁。但java和c#的语言特性是类似的。
在不少类的命名上,它们都一模一样:
//java System.out.println("java比C#强!j-a-v-a!"); //C# System.Console.WriteLine("你没看到#是4个+吗,我比c++还强2个+,你就歇菜吧!");
c#出现的时间比java晚,因此天然吸取、借鉴,同时又有它的创新,好比很早就支持lamda表达式、好比event和委托,好比var
,好比linq。
但若是从面向接口来说,java一样能够作到event和listener,只不过对象引用的传递比较直接。
而.Net的类库和jdk则各有千秋。
若是从应用的角度来看,javaee和.Net体系几乎都涵盖了主流的开发方向:
桌面、Web、服务端、数据库、网络、移动端、中间件。
哪一个方向,哪一个更强?这个留给读者本身体会吧。
微软给.Net一个宇宙最强的IDE,也给了各个方向统一而平滑的编程体验,不得不说,微软的上手要容易的多。
而java则一开始就和开源分不开,多如牛毛的框架、引擎、包,blabla,用java开发,程序员要懂得东西更多一些。应为你大部分状况下得本身整合。但整合的好了就是很强大的,好比SSH。
在近几年很热的大数据和云计算领域,hadoop、spark、tez、leveldb、mongodb、mariadb、hive、hbase,还有oracle,都各自在本身不一样的层面发力,大部分的这些都对java是极为友好的。
不少java程序员,都以为搞.net开发的,就是拖拖控件而已,其实我能够告诉你,说出这种话的java程序员通常都还比较小白,若是你是搞.net的,你也能够说搞java的都是拷贝别人的开源软件的代码,而后改改而已。
固然改改没什么问题,谁都不喜欢重复造轮子,好比,google里面也并不是所有是创新,常常”拿“别人的东西本身改吧改吧,淘宝就很不用说了,招了一些能改c、会点编译的程序员,常常拿各类开源框架开刀,而后代表是本身的东西。好比双11的那个问题。
固然不是说淘宝找的人有问题,而是这个企业的文化就是销售和广告文化,后来的google也如此。
回到正题,wpf和silverlight(虽然已经EOL)中最大的创新莫过于xaml技术,若是你认为wpf只是winform的简单升级,或者说你只会在wpf中拖控件,说明你仍是一个很是初级的.net程序员,无论你工资上w没有,或者你已是项目经理了。
xaml天生就是为mvvm模型而生,这一点,搞前端的同窗,应该熟悉,即便你不懂wpf,js和html怎么作mvvm,你也应该体会过它的好处。
wpf中在xaml中布局控件,并支持INotifyPropertyChanged接口,能够很是容易的实现界面和数据分离,作出一个mvvm模型出来。
说到标记性语言,咱们看看jsp的jstl、struts2的tags,还有asp.net mvc3以后的razor引擎:
jstl和aspx的标签相似,自由、强大,能够很容易的穿插交织到html标记中;
struts的标签就是个另类,我我的反感这种既不遵循主流标准也不简洁的东西,虽然好多人会说好用,那是个习惯问题,我这么说,不是说这东西难学难掌握,只是比较一下和razor引擎中的标签语法,弱爆了。
razor,强大、简洁、优雅。
你确定以为我是微软.net的粉丝,其实我想告诉你的是,最强的标签语言只有两种,html和xml,穿插动态语句到服务端页面上,而后刷出 html,历来都不是好的作法,由于不仅你一我的写代码,后面可能会有其余人维护这个页面,原本这是须要由web designer来作的事情,可是有了语句,他的维护成本就很高。
规范的页面开发,程序员是不会染指一个css、style的,动态语言在aspx、view、jsp上面应该尽可能少用。不然你不如使用php和asp。
这一点,你会在工做中会深有体会的。
看看如今的招聘吧,动不动就是
精通j2ee,精通struts、spring mvc、hibernate或者mybatis,对mysql、oracle有深刻理解,精通webservice、精通多线程,能处理高并发,有的还得懂jvm,最好有hadoop等开发经验。最后再来个211以上。
.net方面呢?
精通.Net,精通mvc3-五、精通wpf、wcf、多线程,mssql等等等等。
我如今处于离职状态,因此天天收到猎聘上的一些推荐,都很郁闷,由于没有一项是我精通的。
可是不妨碍我在2012年实习中,就拿到了13K的月薪,比一些正式员工可能还要高。
并且,仔细想一想,代码中常常讲到要容易维护、这个设计模式、那个AOP,这个大并发,那个高性能,我我的没有见到容易维护的代码。学习一个新公司的 一套模式,一套老产品,比学习一门新技术须要的时间长得多,你会发现,99%的状况下,你最须要的,不是什么代码,模式,而是对产品的理解、对业务的理 解,不少状况下,除非太菜过小白,你们的代码都差很少,谁有时间重构代码?程序员又为什么加班?
这是行情,一个项目接一个项目,公司须要挣钱的,这是大部分公司的现状。
为了回答java仍是c#的问题,我会从我的经历提供一些参考,既然是个人,那就不会是全面的和准确的,你本身判断。
仍是从故事开始吧!
在科大软院(苏州),由于老婆想和我一块儿在外面过个年,我不得不去临时找实习,当时c和汇编不行啊,因此得选个流行的,什么流行呢,当时是web。
因此我遇到了java仍是c#的问题,确切的是我遇到了j2ee仍是.net的问题。
由于常用windows,又由于.net门槛如此低,因此绝不犹豫选择了.net,当时是不会写SQL的,可是却系统学习了数据库设计原理。
进入公司就接触mvc3,以为好,外企的技术确实比较新呢,比我学习.net时学的aspx优雅,那个时候开始接触并尝试理解mvc模式和ddd的概念。
当时,时薪25人民币。
6个月的实习,基本能玩javascript和c#,而后sql仍是不行,当时记得一个高级开发跟我说,他之前作delphi开发的时候,团队写sql写的好就牛,我深觉得然。
只会用Entityframework + mvc3 + javascript,开发网站的我,用理解很浅的.net的web技术体系,支撑了我和老婆在上海的生活费用,当时10年,咱们租的拎包式入住公寓1500一个月,不算生活费、水电费。
再一次,经过一项技术,达到了个人目标,支撑了个人计划,当时对技术的理解,可是偏执于.Net,对java阵营是不屑一顾的。
后来很快离开了科大软院和苏州,考取了中科院,到了北京,房租是1580一个月,照样不算生活费、水电费。
没办法,学校发的补贴根本不够押2付3的。
找实习,作过什么呢?office编程,并且当时的老板是从IBM下来的工程师,项目主要是java开发,jsf作页面,招我过去,作word编程,还不能使用.net,你猜到了,我用的是vba。
没作多久,公司发钱就开始拖延,两周后,我没有积蓄,只能被迫离职,后来加入一家公司,从4K到10k,用了8个月,在这里,我完善了程序员生涯中 sql能力的快速成长,而且普遍地使用了silvelight、aspx、oracle、mssql技术。记得当时一个北邮毕业的同事,作了6个月的 office文档在web展现,由于涉及到了com编程,因此运行很是不稳定也难于调试,更重要的是,拉一个页面到展现,须要20秒。
老板是中科院软件所的博士,架构很厉害,但对于这个技术细节并不擅长,问我有没有办法,我说作过vba,大概了解word的dom结构,我试试。那个同事说,若是你能作到稳定、快速的实现,你能够拿这个作你的毕业论文了。
我说,我试试。
临危受命,我猥琐地查找资料,研究百度文库如何实现等等,后来为了.Net环境的一致性和可维护,因此抛弃了pdf + flash。
经过大量看老外的东西,我选择了aspose.Net框架 + 一个能把word转为Xaml的框架 + silverlight实现,惋惜这两个框架都收欧元,公司铁定不会出钱,因此我猥琐地对其进行了破解,也开始接触IL码。
docx文档在线编辑 + 展现的功能完成,给老板run了一下,老板点了个赞,显示时间缩短到5秒左右。
后来作了数据库的静态,显示时间缩短为1秒内。老板又点了个赞。
后来带领团队,从mssql迁移代码oracle,至今还记得和老板并肩一块儿写存储过程的情形,并感叹微软自身的数据库外迁还得依靠三方工具的搞笑。
时光很快,当时回想,.Net是多么的强大,是么?
在工做的同时,学业,为了凑够4个成天来实习,也为了本身的将来,我选择了数据挖掘、计算机图像处理、天文数据处理、文本检索、分布式计算、高性能计算等全部听起来很牛的东西。
不求甚解,一段一段的代码和注释,将能掌握的注入到本身的技术骨头里去。
还记得在学校周一开组会,同一个组的基本都是博士了,我放弃硕博连读,由于我实在年龄大了,得养家糊口。
后来一家西二旗的距离oracle很近的公司面上了,记得最后一轮面试是小屋子压力面,从董事长到个人小组领导都在,没有水。
首席架构师是科大少年班的,博士在网络所读的,问了一个问题:
你如何实现google的负载均衡?
那个问题我答的很差,其实即便不理解负载均衡的实现,也该从组成原理的总线仲裁知识中窥的一点参考。
因此那次又被鄙视了。但那次拿到了13K的月薪,当时的总监是汉王之前的副总裁,评价是,基础扎实,思惟灵活,实习阶段就参与公司重大项目研发,值得培养。
直到如今,我,相信也还有不少程序员,遇到了数不清的技术,我常常会茫然,到底我该何去何从?
一些疑问:
访问数据库,随便找个高效的connector或者driver就好了,通常提供数据的厂家,谁不提供connector?ORM是很必要,可是追求性能和反框架泛滥的公司不在意ORM带来的那点便利性,用一个jdbc + sql照样写稳定高效的数据访问。
作web前端,真的须要本身写一个框架出来?真正须要这种开发的项目有几个呢?jQuery和d3,原生的javascript就够了,你写的也许不叫框架,最多就是个wrapper。
数据库的惟一性索引、聚合索引、辅助索引都没搞清楚,就开始搞hadoop、spark、hbase、mongodb,用人单位也一再这么要求的,你的项目中真的有那么大的数据量?在传统的rdbms下解决不了?
你开始知道轮子的概念了,而且知道不要重复造轮子。但是你快不是程序员了,而是框架员了。
因此,回到java仍是c#,这个问题,要比我遇到的技术分裂要简单的多。
个人意见是,忘记java或者c#的对立,若是要作一个开心、有自我追求、同时知足就业的程序员,你须要重视如下方面:
函数调用栈,这个不少高级程序员只知其然不知其因此然。你能够不懂的汇编、函数入口、返回地址、寄存器,但你须要调试,你得深入理解函数调用栈,不管是在dev模式调试struts开发的jsp页面,仍是debug模式调试aspx页面,你得看懂调用栈的信息;
基本的数据结构和算法,数据库中索引的组织方式,是B+树仍是Hash,仍是堆,你的公司有Web、桌面、移动用户,有社区,有产品,你可能要作个推荐什么的,或者研究个社交图谱什么的,这门技术能够帮助你。
一门动态语言。lua、python、javascript,均可以,你须要随时和系统进行交互,或者实现一个原型,或者用程序的方式来画点界面、数据图什么,它们够轻量、够快捷。
一门重量级语言。好比java或者c#。你靠它们吃饭。
理解跨平台的含义。掌握一些基本的跨平台技术,好比xml、c、html、json。
重视网络编程的练习和理解,在你使用URLConnection或者MySqlConnection或者WebRequest的时候,你是 否理解它们的生命周期和底层实现,用什么语言无所谓,你要记住tcp/ip协议和http的基本特性。这样不至于你写了几年程序,还不知道 method=post是什么原理。
找一个顺手的IDE,我我的不是CLI控,虽然不得不CLI,一个顺手的IDE真的能够提升生产效率。搞.Net推荐vs + resharper,搞java推荐intellij IDEA.
关注一些热门而经典的领域,好比机器学习、图像处理、数据挖掘,即便已经有了mahout,不表明你不须要了解这些领域,你可能永远不会在工做中使用它们,但它们的思想值得你拥有,由于你选择了作程序员,而不是哪一个公司的程序员。
剩下的,就是你的解决问题的思路和你实现的硬功夫(编码能力),我相信,不少看这篇文章的人,不可以轻易写出一个ftp服务器,不可以不参考、不联网查询资料写出一个简单的快速排序,也不可以轻易写出一段通用分页SQL,但他们依然能够正常工做。
因此外面的功夫容易忘记,有网络就能拾起,内功才是入骨的东西。
架构不是学出来的,是你的理解到位了,刚好工做中有这么个需求,你就开始整合你的已知,而后开始选择轮子。
最重要的是,你千万不要成为一个只会熟练使用框架的程序员,那样,你会疲于奔命,你也许永远只会使用hadoop,而写不出一个hadoop,你只是一个hadoop程序员,而不是一个分布式程序员。
你也许永远只会使用struts,而忘记了本身写filter,你只是一个ssh程序员,而不是一个web工程师。
人言三十而立,现在二十有九,反反复复,虽然买房买车(俗了~),依然一事无成。
结婚5年,老婆再次怀孕,她很兴奋,我也很开心,因为时常加班,对她很抱歉。
目前离职,有些感触,特撰此文。