心得总结 | IT-北北报

为什么我们还在使用那些陈旧的技术

2017/12 29 16:12

好久不见,技术又革新了吗?我今天来的目的就是解释一下如下几个问题:

1.为什么很多企业单位还在使用Win7,甚至是WinXP,政府机构尤为突出?

2.为什么很多公司前端程序员还在使用jQuery?

3.为什么我们的父母坚决抵制把钱存在互联网金融?

future-2

最近产生了改了一批旧代码,有一些感触,为什么我们还在使用那些陈旧的技术?

最近帮朋友解决一个小问题,看了一下某国有企业的ERP系统代码,我的天哪,是.net写的,而且是WebForm写的,这如果在10年前,绝对属于新技术,从asp时代走到HTML与Server分层书写,能用这种技术写出这么庞大的系统,今天一定是年近四旬的大神了……哈哈哈。

还是最近,梳理了一个用requirejs写的项目,项目写的很复杂,能看出来设计是用心了的,放在三五年前,requirejs的模块化开发的思想还算是先进技术,可是当时写的人如果不在了,后人的维护成本将急剧增加。

我不禁反思,是技术进步太快还是我们转向太慢?这些年究竟发生了什么?经过长时间的琢磨与梦研,我得出了一些不确定正确的观点:

1.利益方与思维习惯的阻力令人发指,让旧技术得以保留。

政府为啥用旧系统?企事业单位为啥用古老的管理系统?原因主要有二。

其一,当时花巨资采购的时候级级拨款,层层审批,绑定了一批利益群体,没有人愿意站出来花力气革新,因为你行将搬起石头砸了自己的脚,试想为什么这批系统刚用了2年就又换新(如果这个系统是2年前开始使用的,那么它一定是3年前开始编写的)?于是再拖一年再升级吧,不然财务支出上无法向上级汇报,一年后经过各种复杂审批,终于决定升级系统,于是开始了漫长的招标过程,这其中又有太多的商业利益,折腾一年半载终于有了候选乙方,开始做需求调研吧,开会、出差、各种讨论会议,快的话又经过了三五个月才能进入编码阶段,反而编码倒是蛮快,经常是催催催(程序员加班的根源),可能三四个月就完成了,这时候你会发现离上一个系统最少三四年时间已经过去了。

其二,我都使用了三四年的Win7和ERP系统,如果换了又要产生新的学习成本,可能触及很多老员工老领导的习惯问题,所以在这方面革新也会受到不小的阻力,很可能新系统在上线后很长一段时间使用不起来,大家还是习惯在老系统上办公,直到有一天下了死命令,必须使用新系统进行办公,否则……,于是大家硬着头皮开始用。

2.商业价值是陈旧的技术的保护伞

对于程序员还在使用陈旧技术编程的问题,首先我要恭喜你,因为你还在维护陈旧的代码,起码说明了一点,在商业上这批代码还有价值,还有金主替他买单,不然没人会逼着你改这些目不忍视的代码。因为当年这系统就是用jQuery写的,你要维护他,就必须用jQuery,重写一遍的代价太大了,而且存在了几代程序员的更替,很多坑都不得而知,经常会出现改了一行代码,莫名的程序就运行不起来了……于是商业的保护伞也触发了人类惰性的根源,既然老技术也不错,很多地方都在用,就一直沿用吧……

3.固守的思维方式是时间给的烙印

互联网金融近几年大行其道,当你劝说你的父母把积蓄放到上边能获得比银行更高的收益的时候,他们表现的往往是坚决抵制,誓死不从。最常见的理由是 —— 不安全!对于70年之前的人,他们在银行体系下受益并生存了长达几十年之久,你让他们放弃简直是颠覆性的,当然不乏有思想开放的一些人,他们最先拥抱变化,甚至创造变化,想想互联网界如今顶端的大佬,马云、马化腾、柳传志无疑都是那个年代思潮的先驱。可视99%的人都是凡人,我们不能责怪他们冥顽不灵,因为你没有生活在他们当时的年代,很多事情你无法理解。

殊途同归,这三个问题,最主要的原因我姑且都归咎于是思想的滞后导致行动的滞后,而思想又是最难以改变的东西,都说“江山易改本性难移”就是这个道理了。时代的车辙滚滚向前,走出安逸区,不停的***新自己的认知,去学习,去积累,去升华自己,才能成为那1%的阶级跃迁者。

 

欢迎关注公众号,我们会不定期分享前沿技术、学习资料,在前端的道路上一起成长

qrcode_public

 

 

前端打怪升级的心路历程

2016/07 11 15:07

如果前端像一个打怪升级的过程,满级90级,基本曲线可能是这样的。
新手村任务学习css和div,还有简单js,学会了切图,恭喜你升到了5级,可以打开第一个传送门,去城镇中心了 =>

来到城镇中心,你接到了第一个任务,去野外打怪练级,主要是熟练掌握Javascript与jQuery,通过这个任务,你升到了10级 =>

接下来的任务稍微复杂一些,去野外探索主流的jQuery Plugin,UI框架,HTML5、Css3特效,经过了这番历练,你顺利升级到了15级 =>

接下来,你有幸离开城镇中心,去整个world去自由探索了,在这里你将遇到前端庞大的生态体系,并且你要根据你的情况给自己加天赋点了。第一件事,你要学会简单工程化思想,比如自动构建,这里你可以根据自己的天赋去学习gulp or grunt,完成了前端的压缩合并,降低http请求的初步实践后,恭喜你,升到20级了 =>

然而困难才刚刚开始,如何合理的安排你的目录结构,怎么更好的去做构建将成为你的下一个课题,从现在开始,你要建立模块化的思想了,css、js、html、image怎么合理的排兵布阵,发挥应有的效力,为了完成了这些,你可能用到了sass or less等css预编译框架,requirejs or seajs模块化脚本框架,至此,25级我想你应该有了 =>

但是如今的前端发展已经不是你能想象的了,25级在很多人看来已经是大牛了,然而,我们目前前端界有三个最困难也是必须要啃的副本,AngluarJs、React、Vue,AngluarJs是最早由Google发布的MVVM框架,so,或多或少你要***一两次这个副本,去理解它的思想,***完这个副本,我觉得你至少要到35级了 =>

紧接着React和Vue的副本难度将更加巨大,很多颠覆性的思想开始弥漫开,你再也不能像从前那样去思考前端问题了,你要突破自己,颠覆自己,去迎接组件化时代的到来,同时,新的ES6装备你必须***到,node.js的应用你也要如数家珍,这两个副本至少会让你升15级,50级 =>

当然伴随25级后的整个过程中,你要经历PC端和移动端双端开发的训练,也许你会接触bootstrap、也许是Ionic,也许是zepto,也许是React ui,也许你会懂flex布局,总之,移动端的训练会给你增添10级的经验,60级 =>

至此你应该已经拥有组团打****的能力了,接下来你可能要思考的更加广泛一些,如何与服务器端配合,底层数据库逻辑是怎样的,请求是怎么通讯的,业务是怎样的,怎么样打怪可以掉更多装备与金币,这些思考可以让你升10级,70级 =>

我觉得70级之后,真的就是要拼天赋的时候了,这之后的发展道路完全看你的天赋点,你是力量型技术主力,成为技术大牛;还是法师型指挥官,掌控全局;亦或是敏捷型伤害输出,对技术产品有敏锐洞察力,引领方向。不管你是什么类型,这个阶段的磨练将经历你职业生涯中比较痛苦的过程,这之后……

我也说不定了……

Javascript极致性能技巧

2016/05 22 09:05

对于一些追求极致的同学,可以不惜一切代价去减少1byte的I/O量,去提高千分之一的性能消耗,去认真思考什么是优雅的代码。

使用!!操作符转换布尔值

有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值。为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单。对于变量可以使用!!variable做检测,只要变量的值为:0、null、” “、undefined或者NaN都将返回的是false,反之返回的是true。比如下面的示例:

function Account(cash) {
this.cash = cash;
this.hasMoney = !!cash;
}
var account = new Account(100.50);
console.log(account.cash); // 100.50
console.log(account.hasMoney); // true

var emptyAccount = new Account(0);
console.log(emptyAccount.cash); // 0
console.log(emptyAccount.hasMoney); // false

在这个示例中,只要account.cash的值大于0,那么account.hasMoney返回的值就是true。

使用+或者~~将字符串转换成数字

这个技巧非常有用,其非常简单,可以交字符串数据转换成数字,不过其只适合用于字符串数据,

+和~~有点区别,不能转换为数字的字符串,+将返回NaN,~~将返回0,比如下面的示例:
console.log(+”1234″); // 1234
console.log(~~”1234″); // 1234
console.log(+”ACB”); // NaN
console.log(~~”ACB”); // 0

这个也适用于Date,在本例中,它将返回的是时间戳数字:

console.log(+new Date()) // 1461288164385

并条件符

如果你有一段这样的代码:

if (conected) {
login();
}

你也可以将变量简写,并且使用&&和函数连接在一起,比如上面的示例,可以简写成这样:

conected && login();

如果一些属性或函数存在于一个对象中,你也可以这样做检测,如下面的代码所示:

user && user.login();

使用||运算符

在ES6中有默认参数这一特性。为了在老版本的浏览器中模拟这一特性,可以使用||操作符,并且将将默认值当做第二个参数传入。如果第一个参数返回的值为false,那么第二个值将会认为是一个默认值。如下面这个示例:

function User(name, age) {
this.name = name || “Oliver Queen”;
this.age = age || 27;
}
var user1 = new User();
console.log(user1.name); // Oliver Queen
console.log(user1.age); // 27

var user2 = new User(“Barry Allen”, 25);
console.log(user2.name); // Barry Allen
console.log(user2.age); // 25

在循环中缓存array.length

这个技巧很简单,这个在处理一个很大的数组循环时,对性能影响将是非常大的。基本上,大家都会写一个这样的同步迭代的数组:

for(var i = 0; i < array.length; i++) {
console.log(array[i]);
}

如果是一个小型数组,这样做很好,如果你要处理的是一个大的数组,这段代码在每次迭代都将会重新计算数组的大小,这将会导致一些延误。为了避免这种现象出现,可以将array.length做一个缓存:

var length = array.length;
for(var i = 0; i < length; i++) {
console.log(array[i]);
}

你也可以写在这样:

for(var i = 0, length = array.length; i < length; i++) {
console.log(array[i]);
}

检测对象中属性

当你需要检测一些属性是否存在,避免运行未定义的函数或属性时,这个小技巧就显得很有用。如果你打算定些一些跨兼容的浏览器代码,你也可能会用到这个小技巧。例如,你想使用document.querySelector()来选择一个id,并且让它能兼容IE6浏览器,但是在IE6浏览器中这个函数是不存在的,那么使用这个操作符来检测这个函数是否存在就显得非常的有用,如下面的示例:

if (‘querySelector’ in document) {
document.querySelector(“#id”);
} else {
document.getElementById(“id”);
}

在这个示例中,如果document不存在querySelector函数,那么就会调用docuemnt.getElementById(“id”)。

 

数组截断

这个小技巧主要用来锁定数组的大小,如果用于删除数组中的一些元素来说,是非常有用的。例如,你的数组有10个元素,但你只想只要前五个元素,那么你可以通过array.length=5来截断数组。如下面这个示例:

var array = [1,2,3,4,5,6];
console.log(array.length); // 6
array.length = 3;
console.log(array.length); // 3
console.log(array); // [1,2,3]

替换所有

String.replace()函数允许你使用字符串或正则表达式来替换字符串,本身这个函数只替换第一次出现的字符串,不过你可以使用正则表达多中的/g来模拟replaceAll()函数功能:

var string = “john john”;
console.log(string.replace(/hn/, “ana”)); // “joana john”
console.log(string.replace(/hn/g, “ana”)); // “joana joana”

合并数组

如果你要合并两个数组,一般情况之下你都会使用Array.concat()函数:

var array1 = [1,2,3];
var array2 = [4,5,6];
console.log(array1.concat(array2)); // [1,2,3,4,5,6];

然后这个函数并不适合用来合并两个大型的数组,因为其将消耗大量的内存来存储新创建的数组。在这种情况之个,可以使用Array.push().apply(arr1,arr2)来替代创建一个新数组。这种方法不是用来创建一个新的数组,其只是将第一个第二个数组合并在一起,同时减少内存的使用:

var array1 = [1,2,3];
var array2 = [4,5,6];
console.log(array1.push.apply(array1, array2)); // [1,2,3,4,5,6];

将NodeList转换成数组

如果你运行document.querySelectorAll(“p”)函数时,它可能返回DOM元素的数组,也就是NodeList对象。但这个对象不具有数组的函数功能,比如sort()、reduce()、map()、filter()等。为了让这些原生的数组函数功能也能用于其上面,需要将节点列表转换成数组。可以使用[].slice.call(elements)来实现:

var elements = document.querySelectorAll(“p”); // NodeList
var arrayElements = [].slice.call(elements); // Now the NodeList is an array
var arrayElements = Array.from(elements); // This is another way of converting NodeList to Array

 



无觅相关文章插件,快速提升流量