程序猿的大限
距离上一次主动找工作,快到5年了,到现在的东家,是差不多3年前猎头挖过来的,而当时东家刚刚被欧洲一家有百年历史的跨国企业集团收购,所以我也就有幸成了一名“外企员工”,但是集团保留原东家人马,一切制度照旧,因此我只能算一个“伪外企”员工了。不过,很快就到了“鸡飞狗跳”之年,公司挖来了一个世界500强公司的Java背景的高管,一切唯KPI马首是瞻,只看结果不看过程,难怪总部的各个级别的员工都称呼自己的直属领导“老板”,以前就常听在外企的朋友说自己的领导是老板,现在终于明白了这种称呼的含义了。习惯了以前还比较人性化的工作模式,一下子觉得“鸭梨山大”,难以适应,于是打算看看有没有合适的地方,在年后加入了求职大军,本以为凭借10年架构经验找个工作不是难事,没想到惨遭滑铁卢--大限到了!
浏览各大招聘网站,比如前程无忧,智联招聘,猎聘网,普通开发工程师偶尔有写年龄30以下,而高级开发工程师、开发经理/技术经理,有相当部分写明35岁以下了,架构师,技术总监,也有不少写明35岁以下,最高的就是40岁。其它未明确注明年龄限制的,可能不是不注明,而是HR手工筛选简历的时候设置了,而那些注明了年龄限制的,人才网站后台自动就给筛选了,根本进入不了HR视野。所以,各位程序猿看官,看清楚木有,看清楚木有,看清楚木有.....重要的话说三遍,程序猿的大限,就是年龄在40岁!!!
所以,这可能是我的简历在没有购买人才网的简历置顶服务的情况下,1个月时间在3大人才网站被查看次数很低的原因,到底有多低,本猿不好意思说,因为大家可能会觉得我简历很渣,我也觉得我的确只是一个普通的猿,不是明星猿,不是网红猿,只是一名在软件行业摸爬滚打了10多年的老猿...(捂脸)
周末跟一个某技术群的朋友聊起这个40岁大限的话题,朋友谏言:
尽早筹备自己的产品,不要到大限之日才奋发图强。掌握其他业务知识,走专业领域路线。
这位朋友说的很对,并且也不止一位朋友对我说过要有自己的产品了,并且不少朋友真折腾出了一些自己的产品,比如啥OA,CMS等,然后用这些产品接个外包,也能赚些钱,所以才有人说,“人无外财不富,马无夜草不肥。”
但是不是每个人都有这种机会,我深入了解后发现,这些有自己产品的程序猿,大都是利用工作积累出来的,最主要的,跟原来公司的客户保持着联系,自己鼓捣出的产品容易有销路。所以,与其说积累产品,不如说在积累人脉,积累资源。相信这类程序猿朋友,有人已经做了老板,或者在未来做老板的路上。
显然,这条路不是每个猿猿都有,我也没有。
作为70后老猿,我感觉吃“软饭”,比别人要更艰辛。
求学之路
我出生在素有天府之国称呼的的南方的一个小山村,家里面只有一亩二分地,也许我出生的时候赶上了好时代,改革开放来了,没有哥哥姐姐他们那么苦,印象中打小每天吃饱了就和大院子里面的一大群小伙伴山前山后到处玩,捉虫打鸟,戏水抓鱼,骑牛吹牛,很幸福的童年。小时候妈妈问我长大了理想是什么,那时候正好看到哥哥的课本上有建设四个现代,计算机是很厉害的东西,于是我就说我长大了要当“计算机科学家”!我爸爸就说这孩子将来有出息,不让他干农活,好好读书吧!
那个时候,作为人口第一大省,“读书”是一件很不容易的事情,而且那个时候正是计划生育的前几年,赶上人口出生的最高峰,一到了大清早,公路上上学的孩子绝对比大人多得多,但是没有足够的学校容纳,所以有不少同学4年级就辍学了,等到了6年级,从各个村小学到了镇的中心完小,发现一共有8个毕业班,但据说只招收2个初中班,所以那个时候考上初中,都要在村子里面贴红榜,就像现在考上大学一样。幸运的是,虽然我没有认真复习,考试前一天都在玩,居然顺利的考到了前面几十名;而不幸的是,跟我一起玩到大最要好的几个小伙伴,他们都没有考上,其中有一个走关系复读了一年还是没有考上,所以自初中开始,我与院子里面的其他小朋友就走向不同的命运了,现在想起来真是残酷!
后来,我顺利的考上了市里面不错的中学,到了这个时候,我发现家里面为了供我读书,加上哥哥姐姐到了成家的年纪,经济上非常拮据,所以我只好要最少的生活费,但每次老爸都问够不够,我说够了。然而这个时候,正好赶上了“教育市场化”改革,高校“并轨”,很多大学的学费比起之前涨了不少,对于我们家的情况来说去上大学实在是很奢侈的事情。看到跟我一起长大的院子里面的小伙伴,在东南沿海城市打工风光的样子,我心里面想的,只是早点毕业去打工,为家里面减轻一点经济负担,但老爸坚决要求我要去上大学,说读书才能改变命运。由于心里面的抗拒加上高中阶段巨大的学业压力,虽然在理科重点班读书但成绩并不那么好,而那个时候不像现在这样是先考试后填报志愿,有2类大学学费比较低,一个是师范类院校,一个是农业类院校,当时我想如果填了这类学校就没有理由不去上大学了,于是随便写了一个后来被人们认为“很不科学”的专业的学校。考完试公布了成绩和录取情况,班主任找到我说你怎么写了这样的一个学校的专业啊?你回来跟其它没有考上重点大学的同学一起再复读一年,我保证你们明年都考上重点,我说不用了老师。
后来还是执拗不过父亲,坚决让我去上学,说没有钱但保证能够从亲戚朋友那里借到。为此父亲拉着我去省会城市走访一个平常都不怎么来往的亲戚,父亲老早就抱怨这亲戚看不起“泥腿子”,所以印象中除了很小的时候去过这个亲戚家后来再没有去过。父亲怎么跟亲戚谈的有没有向亲戚借到钱没有跟我说我也不敢问,来这一趟我想父亲都是拉不住脸皮的。
不过,答应父亲来上学我后来还是后悔了,因为不久就听到同学们都在谈论现在并轨后也不包分配了,并且这个“很不科学”的专业出去基本上找不到工作,唯一的路径就是继续读研再读博,而这对于我来说显然不现实,于是来学校第二年我就开始自学计算机 相关的专业,还参加了全国计算机等级考试,甚至买了本清华的人工智能教材自学,为儿时的那一点快要破碎的梦想补上一点点火光,预备将来有机会去搞计算机,虽然不能当科学家了但毕竟还是自己最感兴趣的事情。
(PS:现在回想起来那么早就了解人工智能AI方面的东西了,解到人工智能包括专家系统,机器学习,模式识别等,为此还学习了几天Lisp,Prolog这种教材钦定的AI语言,并且认定将来一定是AI的时代,可惜没有坚持下来深入研究学习,后悔啊!)
初试锋芒:VB6
现实比较无情,不包分配了,毕业即失业,找不到工作,就在家里面干农活,5月的麦田,烈日、麦芒与汗水,真切的体会到了农民的艰辛(PS:现在国家成立了农业农村部,希望这是一个好的开始),之前觉得读书很苦,现在比起来都不算什么了,为何父亲不让我早点体会下呢....在家干活虽然不完全算是“肯老”,但相亲们议论纷纷老父亲脸上也挂不住啊,无论如何得找份工作。还好这个时候已经是90年代末,小县城也有了电脑城,于是去找了一个装机的活,跟着师兄学了两天,也能鼓捣着独立装机了。以前学的都是软件设计编程方面,现在能够真切的跟计算机的实际硬件接触,也加深了我对计算机的理解,不过我更感兴趣的,还是写程序,现在终于有机会在闲暇的时候,利用老板的电脑,装个VB6,写点小程序了,比如写个小小的电脑配件管理程序,记录下每种配件的价格和性能参数,那是还不会用SQL数据库,外面流行的是Foxbase这种,于是直接用随机文件来当“数据库”使用,也算方便。
一个偶然的机会,老板发现了我的编程能力。小县城有几所中专技校,到了期末常常有人来问能不能帮忙写个毕业设计小程序。我说可以,鼓捣个一天就写好了,老板很欣喜,说这不要本钱就能赚钱啊,路子不错啊!于是乎,后来老板利用关系去接了另外一个小县城工商局的系统,要求不仅仅要进行常规的信息管理,还得有电子地图,在地图上进行相关的信息管理。老板屁巅屁颠的就接了,但跟我说只有3万块,我说这个活比较复杂,靠我一个人是不可能完成的,于是老板让我去找外面的人外包出去看看,结果外面开价低于30万没人干。老板这下着急了,工商局得罪不得啊。既然整体外包公司做不行,那就找私人做吧。最后多方联系,从省城来了几个朋友表示愿意试试,他们说他们公司总部在北京,是专业做地图数据的,并且还说他们4个人有2个都是研究生,技术绝对没有问题。老板一看这个阵容不错,就跟他们私下去谈了,具体多少钱我不知道,但最后他们只愿意做管理系统,不愿意做电子地图这部分。我自告奋勇的说,老板,这块功能我来做吧。老板说,好,最近你就不用来这里装机了,给你一台电脑回去加班做。就这样,拉起一支三五个人的队伍开干了。
对于电子地图,我想的比较简单,就是加载一个地图照片,以它为背景,在上面画一些区域来表示每个镇的管辖范围,然后再标记上每个镇的工商所和企业位置,用一个个图片按钮来做。这里面最困难的是每个镇的颜色标记填充,由于都是不规则的图形,如何填充颜色废了很大脑筋,最后终于鼓捣出来了。为了能够动态的修改地图上的信息,又搞了一个地图编辑器。后来,客户要求在IE浏览器上也要能够查看,于是利用VB的ActiveX控件,开发了一个电子地图浏览器。除了我自己负责的电子地图部分,我还需要经常跟远在省城的伙伴联系项目工作事宜,了解到他们的管理系统使用的技术是ASP+SqlServer。就这样过了3个月,项目的雏形终于有了,客户初步看了下,对电子地图没有提意见,但对于管理系统不满意,说不好看,于是把省城的伙伴叫过来,老板请吃了一顿饭,其中一个朋友说小伙不错,居然把地图搞出来了啊!最终经过几次改版,项目终于交付了,但老板不高兴,他说亏钱了,不仅没有给我一分钱奖金,还埋怨我为何当初说可以接这个单(¥%#,我只是说技术上可行,项目到底多少钱我怎么知道)。后来客户的负责人又过来说准备做2期,但不了了之,可能老板上次真亏钱亏大了。又过了几年,我才知道,原来我做的这个电子地图,跟“地理信息系统”(GIS)很相似啊!
项目做完了,也算第一次了解到了有ASP这种动态网页的网站,以前自己都只会做个静态页面啥的,于是对ASP有了点兴趣,不过我很快了解到ASP代码是解释性的性能没有VB这样编译型的程序执行快,所以对VB6的Web工程项目很感兴趣,甚至对VB6的DHTML项目也感兴趣,开发客户端动态效果的网页很强大,代码是编译的,比直接写JS即安全又高效。可惜我当时并不熟悉Web开发的知识,甚至对于HTML都不太了解,而对VB又情有独钟,没有深入学习ASP或者其它Web开发语言,比如Java,PHP.我当时对桌面开发更感兴趣。
后来证明,我专注VB的桌面开发这个方向错了,Web开发越来越流行,到处都在听说建一个企业网站多少多少钱,一个域名多少钱,托管一个服务器多少钱,Web开发技术人员如何抢手。于是被电脑城的一个老板忽悠去帮他开公司做企业建站的生意,风风光光的大量招聘人去拉单子,结果却很糟糕,没有拉到像样的单子,在我们这个小县城大部分人对互联网根本没有概念,只有我们IT圈子的这很小一部分人在谈论这个貌似很火的东西。不到半年,老板的一个亲戚说现在互联网泡沫都破裂了,你们还搞什么,于是老板把公司关闭了,我再次失业了。后来我才知道,这次互联网泡沫破裂影响很大,只不过我们这里IT比较落后,没起什么波澜而已。
崭露头角:ASP
幸运的是,通过之前建站搞网站的过程,我知道了人才网这种网站,于是抱着试一试的想法去人才网投了一份简历,没想到很快就接到了一个在线旅游网站的电话,问1500元愿意来负责网站程序维护和开发不。接到这个电话高兴坏了,第二天就去省城这家公司报道。当时这家网站公司很小,跟另外一家公司合租的办公室,加上老板一共才5个人,所以我是唯一的程序员,和一个Web前端同事一起工作,另外一个前台和一个商务推广。当时几乎身无分文,来到公司第一次吃上免费的工作餐,老板还安排了住宿,感觉真是运气太好了遇到了一个好老板,一定要努力工作。来公司第一天的任务就是解决“共享上网”的问题,当时上网费很贵,就用163拨号上网,然后用Sygate这个软件共享上网。由于只有这样一个破解版的共享上网软件,而且还是英文的,并且头一次使用,可能是破解的原因吧,按照教程一步步配置下来就是不稳定,一会儿又断了,又必须重新进行一次繁琐的配置。终于搞到凌晨2点,办公室的几台电脑都能上网了。按照老板的嘱咐,这台共享上网的电脑不能关机,一关机又得进行好多次繁琐的配置才能上网。对于一个在线旅游网站来说,上网是多么重要的事情,第一次发现,网络问题并不比写程序简单。
在公司第一次“出色”的完成了任务,我就有了一个监职角色:网管,以至于老板家里面几台电脑共享上网,每次出现问题都要找我去帮忙解决。不过,在老板家我知道了老板和老板娘都在玩“联众游戏” 这种东西。。后来公司搬迁到了一个比较大的办公地点,从电脑采购,到网络布线,到弱电设计,服务器托管,十足一个网管的工作。说到游戏,一年后大家都去玩QQ游戏了,包括公司前台没事都在玩,老板也在玩,但我对游戏并不感兴趣,只想着把工作做好。后来网络游戏大红大紫,成为互联网公司最赚钱的业务,再次错失行业热点!
来到省城安顿好后,我跟之前一起在老家县城做项目的朋友打了一个电话,朋友问好啊,你也来这里了,还是这里空间大啊,你现在用什么语言做Web开发呢?我说ASP。朋友说,我们都用Java了。这不算是第一次听说Java这种东西,之前在电脑城,就常听一个老客户说他家亲戚在深圳用Java做很大的项目,但是,我对此并没有概念,不晓得从这个时候,一种叫Java的语言跟大项目总是有某种联系,并且用的人会越来越多,而我仍然认为,ASP这么好用,做Web开发多方便啊。这期间,我也了解到了还有PHP这种开发Web网站的语言,初步了解后认为,这跟ASP没有本质区别吧,只不过它常常在Linux系统上使用而已。这样,我又错过了使用PHP这种“最好的(Web开发)语言”。于是,在工作闲暇之余,经常去动网论坛逛,通过学习动网论坛的源码,使得自己对ASP开发高性能网站有了更加深入的了解,跟Web前端同事配合,能够很轻松的开发出网站各种功能,有了更多的时间去了解旅游相关的业务知识,和老板一起讨论设计网站的功能。慢慢的,网站功能越来越多,用户量也越来越大了,网站一直平稳运行,对ASP这种Web开发技术感觉还是不错的,比如开发效率方面,老板让我抄袭一个人才网出来,我差不多1个月时间从功能设计到程序开发就做完了,上线后很快就吸引了近一万用户。后来,老板找到科大的2个研究生,让他们给重新设计下,他们对我说准备用Java来做,但是最后不知道什么原因不了了之,可能老板的主要注意力放到能够快速赚大钱的“3721网络实名”上去了。很快2年过去了,网站压力变得大起来,从一台服务器增加到了2台服务器,于是老板请来了一个顾问帮忙看看有没有问题,顾问说说他都在研究 .NET了。这是我第一次听说.NET,初步了解了下,说.NET是微软为未来10年的世界准备的平台。也许,与.NET的缘分,就是从这里开始的。
新时代的大门:.NET 1.x
不久,一个朋友说他们北京的公司要招人,并且说北京是全国IT最好的地方。以前在老家电脑城装机的时候,就常常谈论北京的中关村,现在有机会了,自然想去看看,于是就被朋友忽悠到了北京。到了才知道,公司要做一个互联网信息监控产品,简单说就是做一个爬虫去互联网搜索包含指定关键词的网页然后提纯入库,聚类分析,用来走舆情监控,商业竞争情报分析等。这中间比较关键的技术是URL和内容排重,中文分词和聚类分析。我对这个项目很感兴趣,可是负责项目的老大不久就离职了,介绍我来的哪个朋友也离职了,所以产品要怎么做没人知道,老板也不怎么过问,只有我来接这个坑了,所以中文分词和聚类分析没法真正去做。开发一共就2个人,还有一个监职的测试,另外一个开发其实是没有太多经验的妹子,只会写点ASP,所以主要的工作都是我在做,那么在技术选择上,决定尝试一下.NET开发,那个时候还是 .NET 1.1刚出来,用的VS2003,不过比起我之前用的VS6.0已经好了很多;开发语言上我选择了VB.NET,不用说VB是我的看家本领,并且写了几年ASP,对VBScript也相当熟悉,自然选它了,所以产品的最终架构是B/S端使用ASP,C/S端使用VB.NET。大概过了3个月,产品雏形就出来了,老总看了比较满意,然后慢慢优化改进,半年后老总带着我去看了客户负责人,某市公安局负责网络信息监察的主任,听到对方谈论最多的是如何监控QQ视频聊天和其它视频聊天里面的不法行为。当时候视频应用还是相当少见,这些视频聊天软件我从来都没有用过,我们的互联网信息监控完全就不对路子,现在想起来在10多年前就有网警了,而且还是超前的视频监控,对我们警察蜀黍的业务能力还是相当敬佩的。回到项目的话题上来,自然是后来合同一直没有签下来,然后工资开始发不出来了,我看情况不对赶紧辞职找新工作,在我辞职半年后,这家公司果然倒闭了。当然这个项目我最大的收获就是通过VB.NET进入了.NET的世界,与后来的C#比起来,VB公整的语法和规范的格式,智能的编辑器,至今都是我业余写程序的首选。
辞职后到了一家互联网社交网站,算是山寨的美国脸书网站吧,创始人就是从美国硅谷回来的,我用ASP做些模块。按道理来说开发ASP这是轻车熟路了,但是每天早九点晚九点,甚至10点,每周6天的工作模式让人高度紧张,效率不升反降,多年后大家都在谈论互联网公司的996工作制,才知道当年我在这里也是这种模式。我喜欢宽松一些的工作环境,所以还没有过试用期,跳槽到了一家做GIS应用的公司。不知道这样辞职离开互联网,离开后来大红大紫的互联网社交应用圈子值不值,但那种工作节奏,实在是受不了。
企业应用开发:Web Forms
到了这家做GIS应用的公司,是我在北京印象比较深刻的公司,不仅工作时间比较长,最重要的是跟同事们相处的关系算是有史以来最好的,可能因为这是一家纯技术公司吧,同事之间没有什么利益争斗,跟我在后面那些呆过的公司完全不同。面试的时候,老总说喜欢我的拼搏精神,能够从小县城一路来到北京,老总河南人,性格比较耿直,也许他说这句话是真的。公司老板是南方某注明大学GIS专业出身,却是公司主要的业务员,GIS技术上是北京某大学的一个博导负责,他给公司拉了不少政府项目,当然,也经常会拉几个他的学生--博士研究生来公司工作,而我们就跟这几个博士一起做项目和产品,有时候博导也来指导我们的技术,在公司3年,没有觉得博士跟我们有不同的地方,他们都很谦虚,还常常向我们请教一些程序开发方面的问题;但是他们研究的东西,我一点也不懂,不过我也知道他们使用的GIS技术,比我几年前搞得那个电子地图,是一个在天上一个在地上。公司产品主要的业务在房产,公路和矿山方面,当时用的是ArcGis和AutoCAD等。博士们用C++做这些产品的应用开发,而我们用.NET做这些客户的外围管理系统开发,C#语言,ASP.NET WebForms,我第一次正式项目使用C#语言,也是第一次正式使用ASP.NET,感觉WebForms除了它的那些服务器控件的使用和自定义服务器控件的设计开发之外,开发模式跟WinForms特别相似,所以没有遇到特别大的障碍。后来给东北一个客户做房产产权产籍管理系统,来了一个老大,在这个项目上我学到了很多东西,包括服务器控件的使用,自定义服务器控件开发,ORM,SQL配置文件,IOC,工作流,报表中间件等。老大经常说做完这个项目就要去美国斯坦福大学读书,但项目还没有做完他就辞职了,所以这许多东西,都只有我自己来研究。
项目中的ORM并没有使用知名的ORM组件,也不知道是谁写的,那个时候知名的ORM组件还没有大量面世,所以也比较原始粗糙,依赖于反射来处理实体类生成查询的,并且每次只能查询出实体类的全部属性,不能指定查询某些属性字段,这对于有很多字段的大表查询效率不高,所以大部分时候,还是以写SQL查询到DataSet中使用为主。这里就遇到一个亮点,它的SQL并不是写在程序中,而是写到一个XML配置文件中,以一定的规则解析使用。不过,这些XML格式的SQL配置文件写起来还是很费事,好处就是SQL都在一个地方集中编写使用,维护比较方便。后来才知道,iBatis框架(MyBatis的前身)使用的就是这种思想。后来,这种ORM和SQL配置文件的开发方式,又在其它几个项目中使用,ORM查询的不灵活,效率不够高,和SQL配置文件的繁琐,成为我一直思考的问题,将我的一些思考和设计在CSDN上与同行进行交流,逐步有了成熟的方案,比如ORM部分设计了ORM查询语言--OQL,能够指定查询的字段和更新的字段,SQL配置文件部分改进了解析功能,并且设计了一个代码生成器自动根据SQL的XML配置文件生产DAL层代码,这就是PDF.NET开发框架的诞生背景,2006年10月发布了1.0版本,并且之后将公司项目里面使用的智能数据控件也包括了进去,可以实现数据收集,呈现,验证的功能,大大简化页面CRUD的开发过程。
然而,我总结的这个框架还没有来得及在公司推广使用,2007年上半年微软就放出来了Linq2SQL这种技术,我们有同事就尝鲜在项目里面开始试用了,到了2007年年底C# 3.0正式发布,.NET 3.0框架正式支持Linq技术,Linq2SQL获得社区广泛支持。Linq以其强大的表达能力和广受欢迎的程度让我觉得我的PDF.NET框架的OQL技术实在是不值得一提,一个是大学级别的东西,一个是小学级别的东西,一度想放弃PDF.NET框架的继续开发。当时在公司,我们主要的客户使用的数据库是Oracle,Linq2SQL不能支持,所以这个项目引入了iBatis.Net。因为那个时候并没有找到iBatis的C#代码生成器,SQL语句和配置文件全部要手写,然后再手工写相关代码去访问SQL配置文件,由于项目比较着急,查询量比较大,写这种配置文件和相关代码简直累的吐血,发誓以后再也不用这种东西。当然,做这个项目也有收获,就是我基本上阅读了当时iBatis.Net的全部源码,发现这货底层使用了Hibernate的一些东西,所以将iBatis和Hibernate 的一些优点和设计思想借鉴到了PDF.NET框架,逐渐PDF.NET的SQL-MAP功能和ORM功能自己觉得用的比较顺手了,正准备在公司推广使用的时候,微软又放出了 Entity Framework,官方说明它正式支持Oracle数据库了,我们同事决定在下一个项目中使用它,时间正好在2008年奥运会前后。
Web 2.0时代的开启:Ajax
我在这家公司这个时候已经满3年了,除了上面数据框架的故事,还得说说我与JavaScript的一些小插曲。公司里面有很多项目的JS代码都是我在写,当时没有很成熟的前端JS框架,jQuery也没有大量流行,好多功能都是自己手写的,当然现在看来这些功能都不值得一提,比如一个可以在页面新增行删除行修改数据的表格控件啥的,当时我有一次请年假了,回来后听同事悄悄对我说,老总前几天发火了,说这些JS功能除了XX(“我”)就没有人会了吗?当时流行的是ASP.NET WebForms,大部分同事都是用服务器控件的,JS写的好的同事的确不多。但是到了2008年,社区开始流行ASP.NET MVC框架了,它跟WebService和如日中天的Ajax技术结合的更好,大量的社区文章都在讨论Ajax,一些互联网社区网站开始火起来,Ajax的局部更新技术使得网页呈现动态功能更加容易,所以当时主流技术媒体大肆宣扬Web2.0时代来了。假如我这个时候回归互联网,也许能够赶上这班车。当时公司老总找了几个国外的ASP.NET WebForm与Ajax相结合的一些资料让我研究,然而我认为未来是MVC的时代,而且Ajax技术我在来北京第一个公司就曾经山寨了一版了,没什么新意,所以对老总的安排不是很重视,我说我更喜欢后端开发,这在老总看来颇为不解,但他不知道我纠结的是PDF.NET框架如何发展的问题。
说到这里,我不得不跟这家GIS技术公司道别了,原因有2个,一方面是当时很要好的同事要么跳槽了,要么转行了,比如一个很牛的同事转去做售前了;另一方面在公司三年薪资上没有明显提升,公司比较小不怎么赚钱,不太可能花更多薪水挽留我,并且这个时候我已经结婚老婆刚生了小孩,以后家庭需要更多的资金支出,不得不考虑去薪水更高的地方。离职后的几年,我们原来公司的这帮同事还聚会了几次,大家都说像我们这么好的同事关系在别的公司不多见的。也许是公司氛围真的很好吧,一个公司的氛围可能取决于老板的风格,有几个公司的老技术人员在公司工作了很长时间,其中有一个因为家庭原因回东北后还一直兼职做公司的技术顾问。不知道是不是技术出身的老板的固有问题,这家公司直到现在仍然是一家小公司,还在原来的地方办公,祝愿它能够继续发展下去。
.NET 3.x时代:WPF,WCF,Linq
08年奥运会后,我来到一家做银行业务的公司,其实这家公司是2008年金融危机后差点倒下的一个股票证券类咨询公司,现在被它的东家,一家在香港上市的专门做银行系统的公司接管了,所以我也就这样第一次进入了一家“上市公司”。集团公司旗下的我们这家公司主要做银行核心交易系统,用C++和Java做大型机的软件,而我们是整个集团唯一用.NET的开发部门,自然只能做银行边缘的增值业务系统。公司虽然名头大,但对我们,仍然像是一个小作坊,期间正好有一本书《走出软件作坊》,来描述我们当时的情况很像--大公司小作坊,软件研发一点不正规,而公司也派出了专业的项目管理团队来管理我们的软件研发项目,整了一个很高大上的名词:PMO。所以,我跟他们学到了一些项目管理方面的东西,终于有机会担任一个产品的项目经理。这个项目很特别,部门经理是项目里面的开发人员,老总新招聘了一个架构师,所以团队成员有4个是部门经理的老人,另外是随着架构师一起招聘的4个新人。产品是一个C/S软件,在客户端使用SQLite这种嵌入式数据库,架构师费尽口舌在项目里面推广WPF和Entity Framework,说这两个东西是微软平台的未来, 部门经理拉着一帮老人抵制架构师的方案,要用WinForm和手写SQL,吵架吵到老总那里,老总说你们分成2个组,做同样的功能来比比开发效率和程序运行速度。在2010年之前那个时候很多客户端装的还是XP系统,机器配置低,加上架构师一派都是新人,这几个新人水平比较差,这样的比赛结果自然是架构师完败。但架构师是老总招聘的架构师的意见还是有分量的,所以最后项目的技术方案就是一个混合妥协的方案:在产品启动页和首页,因为要用比较绚丽效果,用WPF开发,其它地方用WinForm开发;在产品需要大量查询可能有性能问题的地方,使用手写SQL查询,其它地方使用Entity Framework。
这个项目产品前期需求分析讨论和产品设计大概花了6个月时间,但是给的开发时间只有3个月,从组建开发团队到部门经理与架构师的技术框架之争,又花费了1个月,另外计划的是这3个月还包括1个月的测试时间,所以真正留给开发的时间差不多只有1个月。熬过这1个月紧张的开发,时间本来不够外加团队里面两个技术派的怼怒,磨合不好,进度严重滞后,外加上层领导的催促,重压之下我只好辞去了这个项目的项目经理,我说现在开发人员严重紧缺,我最合适的岗位还是去做开发比较合适。于是,公司从总部派了一个专职做项目管理的高级项目经理来接替我之前项目方面的工作。新项目经理来了后,做的第一件事情就是强令大家周末加班,并停止每天早上的“敏捷站立会”,严格按照项目开发计划赶进度。每做完一个功能,就让测试人员开始测试,让测试人员催着开发人员走进度。在项目重压之下,有两个新同事辞职了,在上线日期之前,还有好几个不怎么重要的模块都还没有开发。但是,到了项目上线日,公司相关的大小领导都来了,项目经理在会上宣布产品圆满开发完成,各个领导也点头同意。这让我非常震惊,一个在我看来根本没有做完的项目居然被领导验收通过完成了,我不得不佩服这个项目经理的公关能力!
项目做完了,产品买的不怎么理想,当然反馈回来都是技术的问题,比如性能慢之类,无法安装.NET框架之类。这个时候部门经理说,大家看看我们用WinForm和手写SQL开发的模块,性能是不是要快些?如果产品不用WPF,不用Entity Framework,就不会有性能慢的问题,并且也不用安装.NET Framework 3.5 框架,而 .NET Framework 2.0是很容易安装的。部门经理说的情况是对的,的确他们小组开发的模块性能明显比架构师小组开发的模块要高。架构师选择WPF和Entity Framework 作为我们公司第一个吃螃蟹的人,遭遇失败,黯然辞职,令人嘘唏不已。此后,部门经理说话在老总那里有了相当分量,于至于在后来的项目里面,部门经理做项目经理的时候,强令开发人员不允许使用ORM,说ORM效率低。我与部门经理之前的关系还算可以,在部门经理与架构师的技术派系斗争中,我表现的比较暧昧,没有明显的表示支持哪一方。这个项目做完后,公司派我去某知名培训机构去学习架构,价值8000块的培训费在那个时候还是很奢侈的,当然也签订了协议培训后必须在公司工作满至少3年。经过一个月的培训后,我就名正言顺的当期了公司的.NET架构师。既然是架构师了,自然得在公司里面搞点什么架构才行,于是在后来某个项目里面,我决定推广我的PDF.NET框架,但是,这却引发了我跟部门经理的矛盾,部门经理说他严禁项目使用ORM,我说之前使用Entity Framework这种ORM是因为这个框架出来不久,它在性能方面的确有问题,但是我的ORM比较轻量级,不会有性能问题。我拿出了测试数据给他看,但还是不行,于是争执到了老总那里。老总说,我看了你的测试数据,但我不懂技术,这样吧我打个电话问问项目组里面的同事怎么看,ORM是不是会影响性能。电话通了,电话另一边的同事说的确会影响性能。我说这一点点性能损失怎么叫做影响性能呢?老总说,公司实行项目经理负责制,他是项目经理他负责,你作为架构师,一定要明确自己的参谋角色。就这样,这个项目没能使用ORM,不过作为妥协,使用了PDF.NET框架的SQL-MAP技术,将SQL语句都写在配置文件里面,然后利用代码工具自动生成DAL代码。项目里面负责数据库开发的同事,算是兼职的DBA,他对这个功能很喜欢,所以他写了很多复杂的SQL语句和存储过程,而其他开发人员写的业务层几乎没有业务代码了。项目交付后,性能不错,部门经理和监职DBA同事都得到了公司的奖励。后来另一个客户需要这个项目的产品,但数据库不是SqlServer,而是PostgreSQL,由于上个项目采用了PDF.NET的SQL-MAP技术,所以基本上这个DBA同事一个人就把SQL Server的存储过程移植到了PostgreSQL的用户函数中,修改了SQL-MAP配置文件,基本上没有修改代码。这个客户的项目做好后,领导对这位同事大家赞扬,并且这年他被评为公司优秀员工。但是,如果之前的那个项目使用的是ORM技术开发,避免写存储过程,那么后来这个客户的项目,根本不需要进行这个移植过程,直接就可以使用。不过,这个项目的移植让我有机会学习了解PostgreSQL这种免费开源数据库,还是很不错的,顺便的PDF.NET的数据库支持清单上,除了SqlServer,Access,Oracle,有了PostgreSQL的PDF.NET驱动程序。
面向开源:PDF.NET
后来终于有机会独自负责项目,那种只有2-3个人的小项目,我在项目中使用了SOD框架的ORM部分,同事们使用后都说,原来ORM这么好用啊,的确比写SQL方便多了。我说ORM也要有适应场景的,太复杂的查询很难用ORM解决,如果非要解决,那就是另一种复杂的SQL写法。所以我对PDF.NET的ORM的看法是它只解决80%的查询工作量,剩下的20%的复杂查询,要么交给SQL语句直接执行,要么修改设计方案将复杂问题简化为一个个简单的问题,复杂的问题难以直接解决我们就绕开它。在这个想法下,接触到了领取驱动设计--DDD这种技术,曾经一度认为只有它才是解决复杂问题的应对之道,也曾经在公司宣传了一下,给同事们讲解建模过程,潜在的来讲DDD的好处。当然,对于当时公司的同事来说,刚用上ORM就算鸟枪换大炮了,DDD这么高深的东西是接受不了的。
看到PDF.NET框架已经在公司成功推广应用,我产生了将它正式开源的想法,之前都是仅限于会员用户才能获得源码。在2011年9月,写了一篇博客,《节前送礼:PDF.NET(PWMIS数据开发框架)V3.0版开源》,正式推广使用,后来陆续收到会员用户朋友的捐助,其中实名统计的前后共有108位朋友,CSDN,Codeplex上各个版本各种驱动下载的总人数超过了1万人次。2015年初完全开源,写了一篇博客:《一年之计在于春,2015开篇:PDF.NET SOD Ver 5.1完全开源》。开源之后,得到很多朋友的使用反馈,修正了不少Bug,框架不断完善发展起来,框架也被我之前的同事带到了其它公司推广使用,有了一丁点知名度。不过,作为框架的作者,我在之后的推广使用中,并不是那么顺利。
预见未来:P2P
我在这家公司除了最后成功推广了PDF.NET框架,还有2件事情值得提下,一件事是把之前做的项目中利用邮件系统完成银行内外网通信的方案发表到了集团公司的科技内刊上,得到公司CTO的表扬;另外一件事情就令人深感遗憾了。2011年初,我们分部的业务发展遇到了瓶颈,整个公司的业务发展也出现了饱和,公司的大型主机维护业务和核心银行系统业务增长乏力,急需寻找新的业务突破口。老总拉着大家一起头脑风暴搞了一个晚上,各种总结思考,要求大家在一个月内拿出自己的建设性方案出来。我的课题就是依托公司所在的金融行业,提出了三个方案,一个是发展村镇银行系统,在传统银行业务线上提供小微银行模式;一个是发展小额贷款业务,就是后来大火的P2P模式;一个是民间征信业务,这个是前两个方案要做好的一个配套方案。老总看到我厚厚的几十页方案,问我怎么了解这么多啊,我说这是我花了很长时间思考和收集公开的资料,分析政策和经济走势,综合分析得出的结果。老总说,希望你的方案能够在公司得个大奖。可惜,老总在年后升职成了公司副总裁,原来的副总当了老总,这件事情不了了之。等我这年底辞职离开公司后,集团的兄弟公司开始做小贷业务(P2P),结合它们之前正在做的银行理财业务,这样左手理财收钱,右手P2P放钱,这家公司一下子赶上了后来互联网金融的快车,业务飞速发展起来,到现在已经成为一家互联网金融集团公司。据说征信业务,也被它们集团内的一个公司拿去做了。后来每每说起这件事情,我都在想这家公司有没有看过我的方案呢?如果我当初不离开原来的公司,转了Java去了这家公司,我是不是能够发达呢?实在令人懊恼不已。(PS:当时之所以要辞职,就是因为看到公司让我们转Java,我觉得.NET已经被边缘化在这里没有前途。)
踏足电商:一波三折
下面说的这家公司是一个创业公司,但实力比较强,老板从原来公司带过来一班人马,做电商拍卖业务。HR招聘的时候说他们招一个架构开发工程师,我以为就是架构师吧,结果发现就是做开发的,想想看一直都在做开发也没什么。来公司后就开始做一个拍卖客户端,我担任项目经理和架构师,团队都是新人,3个同事用WinForm做UI,我和一个同事做后端服务,客户端使用SQLite缓存数据,后端没有直接使用数据库,通过接口调用别的系统,所以这个产品本质上就是一个消息推送客户端,将拍品信息实时推送到客户端,客户端可以进行简单的信息查看然后选择拍品出价。老板对客户端UI比较重视,所以产品经理对客户端UI有近乎变态的渴求,界面要求跟美工设计完全一致,精确了一个像素。按理说这样高的UI要求用WPF比较合适,但考虑到客户的电脑普遍比较陈旧,担心在上家公司做的那个项目那样的性能问题,所以最终选择了WinForm开发。消息推送方面,我选择了使用WCF的双工长连接,封装了一个消息推送框架,当然不是从头开始搞的,使用了一点上家公司做邮件通信系统的时候有关WCF的部分功能,否则在短短1个月时间不可能做出一个原型出来。这个消息推送框架便是后来的消息服务框架。
大概又进行了3个月的功能开发,客户端的后端服务可以支持集群服务,经过了大并发测试,这个拍卖客户端终于面向客户正式发布了。由于这个时候在BS端的拍卖成交率严重下滑,所以拍卖客户端被老板给予了厚望,希望能够大量推广安装,增长成交率。可是令人担心的问题还是出现了,好多客户机都是深度克隆版的XP系统,死活安装不上.NET 3.0框架,就没法安装我们的客户端,唯一的解决办法就是给客户机重装系统。这个问题比较明显的影响了产品的推广力度,老板就不再把它作为重点产品支持了。就这样差不多过了半年,老板将方向转移到了移动端,开发APP产品,一年后,我们这个拍卖客户端下线了,而消息服务框架也没有了用武之地。
客户端产品做完后,公司准备重新设计电商网站,总监进行技术选型,征求我的意见。我说目前我们使用的是NetTiers 代码模板生成的数据访问层,它有一个最大的问题就是每个CRUD方法都生成了一个带事务对象参数的重载,用于有事务的查询,如果A,B方法都对同一个表查询的时候,A方法使用了事务重载,B方法没有,那么有很大概率会出现死锁,所以团队开发的时候必须很小心,避免别人调用错误,而忙中出错又是难免的,另外一个问题就是大家查询的时候都用模板自动生成的查询方法,这些方法默认都是查询出表的全部字段数据的,当遇到大表的时候有性能浪费。总监同意我的看法,说现在Entity Framework比较流行,用它怎么样?我说用它的确在比较简单的查询的时候很方便,但是复杂的查询不好控制,生成的SQL不好优化和调试,另外就是效率不太高(基于当时EF4.X以前的版本而言,EF有比较大的性能我呢提)。于是我拿出了PDF.NET框架跟Entity Framework的对比测试程序,前者在速度,内存方面都有明显优势,总监说行就用你的方案吧。于是我开始在公司推广培训PDF.NET框架,有一个小项目,同事先拿去试用了。正当我准备在新项目中使用PDF.NET框架的时候,原总监辞职了,来了一个新总监,某著名外包公司出身,2年.NET开发,3年Java开发,N年管理经验,来的第一件事情就是否定拍卖客户端的消息推送机制,并试图从理论上证明这种设计就是错误的。我觉得他的这些理论批判是没有根据的,就据理力争。当然结果就是我不再参与新电商网站这个重点项目的研发,打发去维护那个已经没什么人用的拍卖客户端。
新网站项目规格很高,各方面都很重视,招聘了一个新架构师来搭架构,但是能够使用技术是新总监已经钦定的一份“研发技术使用清单”,ASP.NET MVC+Castle IOC+MyBatis.Net。由于旧网站使用的是ASP.NE WebForms,这个组合对于开发团队来说都是新技术,总监分配团队里面不同的人分别去研究这几个技术,然后给大家培训,这个时间大概花了1个月。MyBatis.Net 就是之前的iBatis的.Net版本,开发团第被谷歌收购后改了名字。总监推荐了一个代码生成器来生成MyBatis的使用代码,不用说,效率杠杠的,但实际上,这种自动生成的代码都是针对全表CRUD的,程序运行效率跟之前那些古老的ORM没有什么区别;另外一个问题就是条件查询,MyBatis可以动态拼接条件,大家为了方便都是程序里面直接拼好一个Where条件字符串拿去替换,很少有人真按照MyBatis的规范去使用。Castle的IOC框架在当时还是很有名的,它有对象生命周期管理,用过IOC的人可能知道生命周期管理不好会有坑,出现大对象内存泄漏的问题,这个问题对于团队成员技术水平比较一般的情况来说就比较麻烦了。项目开发过程中的其它问题比如加班加到失控,比如管理啥的不做评论,最后结果就是项目上线失败了,服务器一直宕机,产品经理在上线前一周离职,新总监在上线前一天离职,测试经理一个月后被劝退,甚至新总监的直接上司,研发中心老总也被调离岗位。老板开了一个项目上线事故调查会,追查还有谁应该对此负责,架构师很委屈的说:我只是一个上线(操作)的。后来查明服务器宕机的原因是在高并发的时候,网站程序出现内存泄漏,而泄漏的原因就是IOC的对象生命周期管理失控,但是要修改已经来不及了,IOC的使用在程序各个地方都是,要改等于是很大一部分代码都要重构。最后的结果就是,放弃花了一年时间研发的这个新网站,恢复原来的旧网站运行,将新网站的一些新功能加到旧网站上去。
PS:新网站上线失败的事情还没有完,这件事情对于公司业务打击很大,.NET研发团队在老板那里已经失去信任,而我也被无辜殃及。老板从国内三大门户网站挖来一个PHP研发总监,组建了一个PHP研发团队,他们在平常工作之余加班秘密复制了一个电商网站,但是直到我从这里离职,这个复制的网站都没有上线,可能老板对于网站的复杂性,重要性深有顾虑,不敢轻易替换的原因吧。因此这里就出现了一个很有意思的情景:.NET团队失去了信任,但它的重要性又不敢轻易否定。所以,一切看当时负责研发新网站的.NET团队成员的表现了,而他们也是拼了命的去加班补偿,最后终于赢得了老板的信任,这都是我离职后的后话了。
网站上线失败,PHP团队接管了除网站之外的其它BS项目。后来,一个产品经理提出重做公司后台ERP的方案,PHP团队认为全部使用BS开发即可,产品经理过来找到我,对我说你要多多支持我的方案,.NET做客户端是其它语言难以替代的,你们现在.NET不受公司重视了,这是你们的一个机会啊!这话说的不错,但似乎有醉翁之意不在酒的味道。就这样,这个新的ERP系统BS端采用PHP开发,CS端采用WinForm开发,两端因为如何通信问题尝试了好久,PHP因为无法很方便的支持WebService 而采用了JSON序列化的方式发送和处理请求结果,那个时候还没有流行Restfull API这个概念,我们就这样先试行了。就这样,两个团队专注做自己的东西,我负责的WinForms端开发,采用了PDF.NET的智能数据控件技术,实现了界面数据的收集,绑定,好多界面所需要的代码都没有几行,仅仅需要设置控件的数据属性绑定而已,从而提高了开发效率。参考后来总结的这篇文章:《不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD》。产品做好后,我们的业务人员反映很好用,再也没有之前BS版本那种速度慢,页面卡顿的问题了,并且窗体方式的数据展示效果,内容输入的便捷程度,都比BS方式的页面要好得多,大大提高了现场业务人员的工作效率。为此老板也很满意,奖励我们这个产品的全体研发团队(产品,技术,测试)去国外4日游,而且之后不久,负责这个产品的产品经理晋升为产品总监。
后来,公司改变了拍卖模式,由之前的“秒杀”式拍卖改变成实际现场拍卖会那种分不同拍卖场次的顺序拍卖方式。这种业务模式的改变,极大的降低了网站的并发压力,网站开发团队由于之前尝试新技术的失败,技术趋于保守,仍然用之前的NetTiers 代码生成的模式,只需要最快的速度开发新功能即可;而在其它项目上,都是PHP团队的事情,他们掌握了公司后台的关键业务。但是对我而言,没有进一步发展客户端软件的机会,也没有大型互联网那种大并发,大数据的挑战了,架构的重要性已经不再,到了我跟这家公司说再见的时候。不过,在这家公司,我也有一个意外的收获,公司业务飞速发展,我从业务部门也学到了一些有关业务分析的方法,进行系统总结后,写了一些博客文章,并且参加朋友组织的线下技术思想分享,请参考以下链接:
- 业务分析三维度(场景+角色+时间)之程序员坐禅论道
- CSDN现场分享演讲的PPT
- 由微服务,领域事件,分布式事件谈“业务分析三维度理论”的实践
从上家电商公司辞职后,我到了另一家做电商的公司,老板试图打造一个B2B2C的全平台,利用自己集团主营业务是传统支付业务的基础,试图进入电商支付领域,并且打通线上与线下的交易渠道。老板从某东挖来一个人做电商事业部的副总,基本上电商平台不论从产品还是技术架构都是这个副总定的,而我协助副总实现他的想法,主要是负责Entity Framework在项目中的落地应用,另外负责电商支付模块的设计实现,与集团的支付系统打通,所以我认为我们这个产品更大的意义在于公司从线下支付转向电商支付的一次实验性项目。虽然我早在2008年就接触到了Entity Framework,并且在2009年的那个项目对它尝鲜式应用过了,期间也一直保持关注和研究,7年后这才算第二次正式使用Entity Framework。副总的意思是所有查询都要使用Entity Framework,但是架构设计之处就分库了,所以需要使用Entity Framework做分库查询,并且Entity Framework对MySQL当时的支持并不太完美,有时会有些小Bug,比如某个字段跟数据库的结果不一致,但是其它字段又是对的,经查明是字段类型问题。另外项目开发的比较紧急,开发团队成员大部分都是外包的,之前都没有人用过Entity Framework,他们对SVN源码管理也经常不按规则使用,再加上Entity Framework的数据库升级,问题很多,预计半年的开发时间,差不多有3个月都在折腾Entity Framework的问题,半年时间到了果然没有预期完成开发,而这个时候由于加班多开发压力大,连项目的开发经理都辞职了。这样工期不得不又延续了3个月,所以前后差不多花了10个月才开发完成。项目上线之后就是跟支付那边不断的联调测试,以及接入一些小商家来入驻试用,这块商务方面进展的不是很顺利,所以结果就是前面拼了老命开发,后面又比较清闲没有方向,这样下去不是我废了就是部门要黄,我不得不思考新的出路,恰巧碰到一个猎头把我挖到了现在的公司,而之前公司的那个部门,半年后因为别的公司意图收购他们,部门裁撤了。
这里需要说下离职期间的一些小插曲。老板听说我要离职,派了他的亲信,公司的老员工来做了我三次工作,说如果留下来,承诺未来3年我的总收入不低于120W,平均每年40W,但是第一年只给30W。我听了很诧异,在我离职之前不久公司才给我加薪了,加了多少呢?500块。既然认为我是人才为何才加这么点呢?我将这个情况也给猎头说了下,猎头说你老板这样是没有诚意的,猎头的花言巧语让我相信了他们的看法,留在这里的发展前途没有他们介绍的新地方大。可能最后老板知道了用钱也留不住我,就派了另外一个部门经理来找我,对我说,原来你就是PDF.NET框架的作者啊,我们都看过,很不错的(#$#$一堆赞美的话就不多说了),你来我们部门吧。我苦笑了下,说感谢支持,但我去意已决:-《 。后来到了新东家,才发现远远不是猎头描述的那番美好景象,心想这些猎头真是以卖人为第一原则别的什么都不管的。到现在,居然有很多猎头连Java与.NET都搞不清楚就到处挖人的。
结尾:.NET青春不再,尚能饭否
故事说到这里,终于可以收尾了,文章的开头我已经简单说了下现东家的情况,出于隐私考虑,我现在不方便说太多现在公司的事情,虽然也有很多故事,有很多问题,有不少坑,其实套路都差不多,暂且不表,就简单说说我在公司的工作吧:推动变革,当然我作为系统架构师这个头衔,说“推动变革”没人信,一个公司的变革一定是由很多人一起推动的,起重要作用的可能是公司领导层的领导,也可能是普通员工的一些工作建议。来公司近3年,公司慢慢的由一个传统软件公司向互联网软件公司逐步转型,公司卖了10年的单机版软件,正在重新研发设计为一个具有云-端计算的,复杂的成套解决方案,整个软件不管从开发语言,系统架构,软件功能还是销售模式,都有了巨大改变,用老板的话说,这是我们立足于未来10年的软件。下面大概说说这个软件的情况。
软件功能:
- 具有云端管理与本地作业相结合的B/S+C/S混合解决方案,实现了客户端远程作业联机协作的功能;
技术架构:
- B/S 采用Vue+Bootstrap,ASP.NET WebAPI;
- C/S采用 WPF,Win Forms MVVM框架;
- Office 插件开发技术;
- 数据开发使用SOD框架(原PDF.NET框架之数据框架),使用应用层事务日志实现多个客户端的数据同步复制;
- 消息通信使用“消息服务框架”实现实时消息的推送,以此为基础实现了大批量文件的上传和文件在各个客户端之间的同步;
- 整体上使用微服务架构的设计思想,采用了API网关,前后端分离开发模式,OAuth2.0 统一权限认证。
项目责任:
- 负责技术选型,架构设计,核心架构模块开发;
- 参与项目前期产品愿景设计和讨论,项目开发模式制定,项目开发团队组建;
- 任职系统架构师,兼任产品技术经理。
感谢您能够看到这里,最近浏览各大人才网站,发现.NET相关工作岗位寥寥无几,跟网上其他朋友交流后发现,他们普遍发现今年.NET的就业形势很严峻,大部分还在招聘的企业能够给出的薪资都比较低,甚至低于前端开发人员。一方面是.NET Core开源不断发展,各种.NET微服务框架也都开源了,似乎.NET的春天要来了,而另一边.NET在国内的就业形势越来越恶劣,跟3年前都形成天壤之别,没想到形势发展这么快。前两天刚刚看到一个新闻,说微软取消了Windows业务部门,这跟.NET的发展情况是否有关系呢?未来.NET是重新崛起还是从此走下坡路?
而一直跟随微软脚步,吃微软饭的70后.NET程序猿,青春已经不再,还有继续吃这碗饭的机会吗?
期望的目标:
- 架构师,技术经理/技术总监,项目经理,需求分析师。
如遇伯乐的您,不胜感激!
如果你有批评建议,我在此虚心聆听!
感谢您阅读此文,我的联系方式:
QQ:45383850
电邮可以使用QQ邮件,电话这里就不方便直接提供了,您可以在博客园给我留言发消息,或者看SOD的官网 http://www.pwmis.com/sqlmap 获取更多信息。