单枪匹马你别怕,
一腔孤勇又如何,
这一路你可以哭,
但你一定不能怂。
文 | komawangs
2010 年,公司的项目包括周末每天加班加点的搞了一年,结果还是黄了,它的功能其实比较复杂,早期低估了难度及可能遇到的瓶颈。类似实现一个 IDA 中的流程图与指令表互转的效果,差不多算是一个简易的编译器吧。
有一个地方花了两个月时间,始终没办法搞定,1300 多行的函数都经常F5调试到忘记哪个反大括号了,最终以放弃告终。
接着整下一个项目,也是工业方面的软件。我用熟悉的 VC6 开始弄了,功能已经实现一大半。几乎需要做一个类似 CorelDraw 这种绘图工具,能自由拉伸、缩放、组合、填充等特效的画板。
前期可想而知,我楞是花了三个月时间把框架和基本图形实现了,底层用的 GDI+ 来实现特殊填充,而难度最大的就是多边形和不规则图形的填充。
写到一半等准备信心满满的找 PX 汇报总结的时候,结果 PX 出了点事,这一等就是两年,这两年在公司没有任何加薪没有任何其他福利,偶尔上班迟到居然给扣工资了。同事 Z 忍受不了最终辞职了。
两年后,PX 回来的第一件事情就是让开发的占股成立新公司,大家几乎都是跟了他四五年的人,说单独开个公司做其他项目吧。
后来才知道是 BY 觉得公司的产品算是稳定,开发部已经不需要了,更不要说给我们加薪,都执意准备要解散我们这个部门了,PX 无可奈何,这才准备带领大家另起山头,事先就给 BY 强调说绝不会做原公司的任何同类产品来恶意竞争。
PX做这个决定还是很果断的,当时在我老婆不停奔波下,新公司顺利注册好了,自然我也成了公司原始股东之一。大家出来后原来的公司决定再扶持我们半年时间,意思就是再多发半年工资,做得起来就做,做不起来就砍掉了,而原公司里有什么硬软件要改的,这边还是照样做,但主要做新公司的事情。
PX 大概知道起码得 100W 起步,但考虑到我们几个没什么钱就拟定按 50W 来投钱,当时我出了差不多 3W,因为所有开发部的送技术干股 2 - 5 个点,我自己再买 5 个点就 10 个点了;另一个搞硬件的同事 S 共15%;PX也才占了18%。
当时对股份这个事情也没觉得什么不妥,毕竟大家都是绑在一条船上想把公司做大做强。BY反倒觉得无所谓,随便打了5W 就当投进来玩玩,结果三年之后他就有点后悔股份买少了。技术经理 PX 则此是已要在开始规划公司 3-5年内的产品了,全身心的在带领大家开始加班加点的搞了。
慢慢的才知道,工业级产品不同于普通消费品那种小半年就极可能死掉了:要么过时滞销,要么被方案公司整死。工业级的大多都是十年以上的期限,只要你不停产,总有客户会一直会用你的。
讲到这里,有个心得,商业级的产品一定要坚持,绝对不能用任何第三方无源代码的 LIB 库或控件。因为早些年公司为了加快开发进度,在我来之前就买了一个第三方的无源 OCX 控件,反正那时也就 5000 块(现在这控件居然要卖到50W了)送一个U盘加密狗,只有一个又挺不方面,后来在阿莫论坛上随便找个人就复制了几份,主要是家里、公司、PX 都用起来方面。
当时觉得他的功能挺完善的,结果之后才发现那是“噩梦”的开始。
那个控件是一个前期离职的同事买来的,还留下一个半成品的VC6代码,我接手后看到这套代码,一种砍人的冲动都有了:各种全局变量a、b、i、j、k到处定义声明和使用,最多的一个变量有几百处;函数名就更不提了,全局的、成员的乱成一团简直没法看,本来又想推到重来,结果PX 说时间太紧了等不及。
只好硬着头皮在上面改了,可想而知在这种发狂的代码下擦屁股,是一种怎样的心情!有几次半夜两点叫去公司加班,客户有功能需要连夜改好,这时候已经不冲速溶的咖啡,改泡浓茶了……
最蛋疼的是控件没有源码,我这边能看到的全是 InvokeHelper 之类的代码毫无意义,几次遇到控件的 BUG 找到卖控件的,人家直接叫你 50W 买新版的,我彻底无语了。
在这种高压环境下面,晚上经常呓语工作上的事情。最搞笑的是公司所有的软件从来都没有 1.0,直接从 2.0 开始,PX 的意思是免得别人觉得你的不稳定……
后来我用了 BCG 把界面布局稍微大改一下,等所有的改完基本稳定时,已经是 2.1 的版本,中间起码升级三百次以上,历经了无数个失眠的白昼与夜晚,偶尔有几次,走到楼顶,点上一支烟就会在想,我们这么努力会不会有结果?
因为当时同行业的老大每月大概是 30W 台出货量,老二大概是 10W 台,老三是 3W 台,而我们不到 30 台,听到这个消息对我打击挺大的,有很长的一段时间都非常消极,就像一个看不到前方出路的坑,一个接一个的填不满,挺失落的。
这时,需要一个行业资深的人。比如 PX 就会叫大家在一起,周末找大家去一个咖啡厅或茶馆之类的地方,聊聊天喝喝茶放松放松,憧憬一下未来,这也许是一种团队的精神支柱!
PX 自己本身也写写 C 的代码,偶尔会用易语言写个小工具之类的。随着时间越来越久,慢慢会发现 PX 考虑到的,是近期 2-3 年公司要做什么产品,先把根基打好,再慢慢延伸到同行业其他周边领域的产品。
一直到年底,打击还是蛮大的,一年的出货量不到 300 台,真担心这么拼命弄出来的东西就这么黄了,而且中间一直都没有过分红或其他奖金之类的,在深圳拿着 5K 的工资就这么低头干,每一个人都是身兼数职,这薪水一干就是三年。
待到第二年底的时候,PX 提出来要把 MFC 自带的界面换掉,弄个好看一点的界面,于是我找到了 XTP 库。结果可想而知,这种像一坨屎一样的代码,硬着头皮、捂着鼻子得再重头擦一次。
PX 对软件产品要求比较高,从软件的布局、风格都把控得比较到位,有时候精确到一个MessageBox 中的文字都会斟酌片刻,尽量让任何新手都能熟练的使用。
于是第二年中旬,从 2.1 直接跳到 3.0 版本,新版的软件横空出世,实际上只是改用 XTP 界面皮肤特效,让软件看起来没那么大众的界面,然后让客户觉得逼格又提升了不少。3.0的版本花了差不多半年,期间困扰最久的一次是控件没有提供绘图接口,而且遍历扫描的时候,需要裁剪每一个区域的图形,最后用自己写的简易压缩算法将图形打包,这中间花了大量的时间优化,因为整个硬件的flash 只有 64M,裸跑的系统也得 25M 左右,剩下 10M 左右用作堆栈缓冲,实际用户可用的内存不到 30M,如果一张800*600 的 BMP 图片,即使丢掉 BMP 文件送水也占了很大内存(800*600*4),接近 1.8M了就会导致存不下几副图片,而下面没有找到跨平台的纯 C 代码来解析 PNG、JPG 之类的,这种格式的也有压缩将导致图像不清晰所以放弃。
当时打算 hook winproc 来拦截绘图事件,但这样太复杂了,而且不能保证截图的完整性,因为他有可能还没画玩。后来苦恼很久后,想到了虚拟打印,于是在主视图的后台截图问题迎刃而解了。
在接触工业产品几年后,才知道为什么很多人都没有采用WINCE 系统,WinCE 最大的 BUG 就是掉电保存做不了,微软没有开放接口,导致开发人员只能用定时器来写FLASH,这样会导致很容易写坏,以前有个同行就是用 CE 做的同类产品,一年后全部召回换 FLASH 被迫放弃 CE。
所以很多人宁愿写个简易系统或裸跑,然后加个大的法拉电容用来在掉电一瞬间写入 FLASH,而不会用 WINCE 这种能快速开发但要靠定时刷 FLASH 的方法。
就这样,3.0 的版本稳定下来,已然是第三年了,最恐怖的是还有个 5.0 等着我来踩......
<未完待续>
收集故事 | 分享故事
深圳,一个让我彷徨的“天堂” —— 喜当爹
深圳,一个让我彷徨的“天堂” —— 私服之路
【连载】深圳,一个让我彷徨的“天堂”—— 初出牛犊