技术人的达摩克利斯之剑

听说你技术很牛?对不起,屁用没有小王就像条只有技术的咸鱼,无数的细节压的他根本翻不了身。他徜徉在自己的技术世界里不能自拔,“我完美的解决了一个bug”,“我将这些数据成功归类了”,“我做了一个非常好看的网页”,“我成功将Python2迁移到Python3了”…类似的感受无数次经过他的脑子,让他感到满足。他看不到技术之外的事情,他以为是技术促使了公司的发展。他看不起销售人员,总觉得那是一个不学无术的职位,可他不知道他的工资都是这些人陪客户喝酒喝来的;他看不起产品经理,总觉得那是一个打嘴炮,光说不做的职位,可他不知道他只是一个产品开发中的一环,有时候甚至是不重要的;他看不起运营人员,总觉得那是一个文科性质,没有门槛的职位,可他不知道一个运营团队一次运营活动可以营收他一年的工资;他总觉得自己无可替代,可他不知道西二旗的程序员随便找一个就可以替代他;他总觉得自己在改变世界,可实际上他不过在增删查改,加班熬夜,没有任何余力为开源社区做贡献。自己的项目?想都别想。他总觉得技术是互联网公司最基础的东西,可他不知道,互联网公司首先是公司,其次才是互联网,如果一家公司连商业模式都没有,他根本不可能在这里写代码。他以为,靠写代码可以写出财富自由;他以为,技术厉害的人会受人尊重。写代码写不出财富自由但是这却一些人成长的毕竟之路。他就这样自以为良好的看着一切,瞧不起一切,背着双肩包,穿着格子衬衫,顶着一头数十年不洗的油头,见人说不出话,在北京的地铁里穿越。对不起,屁用没有。技术再牛,程序员本质上还是出卖自己的劳动力,这种劳动形式,和其它任何职业都没有两样。殊不知,指点江山的,从来没有程序员的存在。在探讨商业模式,公司的发展方向时,技术人,永远被隔离开来。你以为这个世界是技术的,其实是资本的。技术好的人,并不会是掌握话语权的人(永远不会,除非突破技术,思考宏观),拥有话语权的,永远都是出钱、给予资本、过渡资源的人。马化腾懂技术,但他并没有动手去写,而是将技术用到了正确的地方;马云不懂技术,但他把握了正确的方向;别以为MS-DOS是盖茨写的,这是盖茨骗来的一桩生意。当然,这里并没有贬低技术价值的意思,而正相反,技术的价值非常高。但是不在让你做困兽之斗的代码细节里,也不在你解决的一个个bug里。私以为,技术本身可以作为一个非常好的爱好去发展,但如若想站的更高,请勿陷入对技术的狂热之中。毫无疑问,我们都是技术的信徒,我也坚信科学技术是第一生产力。但是技术,仅仅是服务商业模式的工具,仅此而已。认识到这点,我们都将发生合适的转变。

January 1, 2019 · 1 min · jiezi

Javascript时间构造的诡异

JavaScript为我们提供了不是很好用的Date作为时间日期对象,除了接口设计怪异之外,还有一些隐藏很深的bug,先看接口设计:Date()直接返回当前时间字符串,无参数。new Date()则是会根据参数来返回对应的时间对象,参数很有意思:// 无参数,并返回当前时间。new Date();// 可接受一个数字参数,该参数表示与1970年1月1日0点之间的毫秒数。new Date(value);// 可接受一个字符串参数,参数形式类似于Date.parse()方法。new Date(dateString);// 可接受年月日时分秒参数,是本地时间。new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);先且不说这样的接口未免不够灵活(很难处理各种字符串格式的时间),最诡异的一点是其中使用dateString的那个构造方法,MDN网站在这个函数下有下面一段注释:注意这里用的是strongly discouraged - 强烈不推荐使用,原先的我没有重视这句话,直到。。。付出惨痛的代价。现象我的一款每日打卡类的App,因为有大量的时间运算,为了能接受各种时间,我做了一个方便的函数:date2ymd(input) { let day = (input instanceof Date) ? input : new Date(input) return ${day.getFullYear()}-${day.getMonth() + 1}-${day.getDate()}}上面的函数在某些input时没有问题,但当参数为类似’2018-10-1’这种格式,按照MDN的文档,就属于强烈不推荐使用的形式,但我没有留意,App发布之后,不错,大部分用户没有反馈问题,直到某天,一个阿根廷的用户给我邮件反馈,说界面上的日历似乎错乱了,我试着更改自己的时区到对应的-3时区,截图一看:上图中彩色小方块的区域是年视图,本来应该和下面的日历一一对应,但在这个时区下,年视图完全错位了,肯定是哪里计算错误了,经过调试,我找到了上面这个函数,并发现了问题,我们用chrome的console演示一下:看到了吗? 从9号到10号,转换出的时间没有翻天,当然,我们可以为这种转换找到理由,JS应该是把这种参数当成UTC时间了,我们看看firefox:Firefox的表现可以理解,因为UTC和-3:00时区之间有个时间差,虽然这依然不是我想要的,但比起chrome的跳变要好接受一些,我们把输入时间换一个格式,再看下在chrome下的例子:这种格式终于符合了正常逻辑,也就是短杠和斜杠分隔的时间处理上是不一致的,斜杠分隔的时间终于正确的按照了本地时间进行处理。结论正如MDN所说,不要使用单字符串参数的Date构造函数,即使你知道各种格式之间的区别,也不建议使用,毕竟记忆这些微妙,甚至不兼容的差别毫无意义。

December 21, 2018 · 1 min · jiezi