Репост из: XiNGRZ's
偶尔会有人私信问我,怎么学一门技术…
我觉得,最好的学习方法反而是「按需学习」,而不是一股脑地从书上扒一堆不一定用得上的技术。
(一)
高中的时候,我的同学都在玩网易博客和 QQ 空间。
那个年代,QQ 空间还在大规模使用 Flash,他们也喜欢在上面加上各种乱七八糟的特效。我嫌这些网站都太卡,版面看得眼花…决定自己写一个阅读器。简单地说,就是把自己同学每天发的东西都聚合到一个地方,方便自己刷…(多超前的概念啊!)
于是开始技术选型…那时候我只会 VB,这玩意写这么复杂的 UI 和网络逻辑肯定是不行的…于是我看了看 Visual C++…好吧,鉴于当时的智力水平,我真的没办法理解什么时候 . 什么时候 ->,为什么字符串的操作看起来这么「陌生」…于是选了看起来更直观的 Visual Csharp
扒网站需要用到正则,于是就去入门了正则表达式;需要分析里面的数据是怎么拿的 (在此之前只会翻 IE 缓存文件夹看请求地址),于是学会了用浏览器的调试工具抓 AJAX 请求…
(二)
后来一段时间,Chrome 火了,Web App 也火了。
我感觉 Csharp 写的 UI 遇到了局限 (主要是当时我不太懂得把 UI 和业务逻辑分开),于是决定尝试把我的阅读器推倒重来,写成运行在 Chrome 里的一个 Web App。
首先,Web App 需要一个服务端 (那时候纯离线的 HTML5 App 还没出来),于是自学了 PHP;服务端和 UI 需要交换数据,于是学了 AJAX (终于用上了,而不是只会分析别人的数据)。
既然是个 Web App,那么离不开 HTML。那时候什么 SPA 什么前端框架的概念其实还不成熟,还处于简单粗暴直接写的年代。那时候不知道抽了哪根筋,竟然想在 Chrome 里用网页模仿一个 Chrome (Chrome App 本身是没有标签栏的),于是开始做一个 Chrome 一样的标签栏…
你们可以自己研究一下,点击加号之后从右边冒出新的标签、激活一个标签之后让原本的标签变回非激活状态、 拖动标签排序…这些经常用的交互,其实是一些很繁琐的逻辑实现的,那时候硬是在学校用草稿纸手写了两三页 (伪代码,不包括具体的 DOM API 调用)。
在那个年代,要实现像浏览器顶栏标签页这种卡片,需要切成左中右三张背景图,塞到一个 table 里。由于代码太过复杂 (其实还是因为那时候我不懂封装),于是寻找方案的时候发现那时候刚出来的 CSS3 可以用一个 div 实现我想要的效果,于是用上了当时最先进的 HTML5 和 CSS3…
写前端的过程中,终于觉得应该要把代码好好地组织一下,于是用上了当时还是很火的 MooTools,开始有了所谓的 OOP 的观念。上课偷偷用手机把 MooTools 的文档全啃完了,还提升了一下英语水平…
再后来,觉得 PHP 解析扒到的 HTML 和 JS 实在太费劲,又用上了当时刚出来的 NodeJS…
(三)
我所在的大学,上外网需要一个特殊的拨号器登录。这个拨号器写得很恶心,甚至还需要安装一些特殊驱动,不支持 Windows 8,也经常导致蓝屏。
一次宿舍楼网络故障,断网期间闲得无聊用 WireShark 看了看拨号器发出的数据,是 UDP,经过加密看不出原本是什么东西。
灵机一动,把登录密码换了一位再抓包看看,和之前的数据比较,确实只变了一个字节…于是一口气把键盘上能按的所有字符全部发了一遍,得到了一份 ASCII 范围内所有字符和加密之后的数据的对应关系。后来想想,好在它是个自己实现的线性加密算法。所谓线性加密,就是原文和密文可以完全一一对应,不受前后内容和其它因素影响。
凭着这份对应关系表观察拨号器发出的数据,基本上解读出了它的构造方式和所有字段的含义。剩下没办法用键盘打出来的字符怎么办?观察到登录报文里有一段是本机的网卡 MAC 地址,于是用工具把 MAC 改成我想知道的值,顺利得出 0x00 ~ 0xFF 的所有对应关系 (即便不知道它们的算法)。然后用 NodeJS 写了个山寨拨号器,网络恢复后马上验证,可行!
后来有用 Csharp 写了个可以实用的简易拨号器,不需要装驱动,单文件直接执行。
再后来换了 Mac,又跑去图书馆借了本 Objective-C 入门的书,照着书把拨号器重新写了一遍搞出了 Mac 版。
这两版拨号器似乎在学校论坛里流传至今。
------
后来,因为工作关系学了 Java,Elixir,C,C++ (对,绕了这么一大圈终于还是避不开它)…都是后话了,以后再说。
我觉得,最好的学习方法反而是「按需学习」,而不是一股脑地从书上扒一堆不一定用得上的技术。
(一)
高中的时候,我的同学都在玩网易博客和 QQ 空间。
那个年代,QQ 空间还在大规模使用 Flash,他们也喜欢在上面加上各种乱七八糟的特效。我嫌这些网站都太卡,版面看得眼花…决定自己写一个阅读器。简单地说,就是把自己同学每天发的东西都聚合到一个地方,方便自己刷…(多超前的概念啊!)
于是开始技术选型…那时候我只会 VB,这玩意写这么复杂的 UI 和网络逻辑肯定是不行的…于是我看了看 Visual C++…好吧,鉴于当时的智力水平,我真的没办法理解什么时候 . 什么时候 ->,为什么字符串的操作看起来这么「陌生」…于是选了看起来更直观的 Visual Csharp
扒网站需要用到正则,于是就去入门了正则表达式;需要分析里面的数据是怎么拿的 (在此之前只会翻 IE 缓存文件夹看请求地址),于是学会了用浏览器的调试工具抓 AJAX 请求…
(二)
后来一段时间,Chrome 火了,Web App 也火了。
我感觉 Csharp 写的 UI 遇到了局限 (主要是当时我不太懂得把 UI 和业务逻辑分开),于是决定尝试把我的阅读器推倒重来,写成运行在 Chrome 里的一个 Web App。
首先,Web App 需要一个服务端 (那时候纯离线的 HTML5 App 还没出来),于是自学了 PHP;服务端和 UI 需要交换数据,于是学了 AJAX (终于用上了,而不是只会分析别人的数据)。
既然是个 Web App,那么离不开 HTML。那时候什么 SPA 什么前端框架的概念其实还不成熟,还处于简单粗暴直接写的年代。那时候不知道抽了哪根筋,竟然想在 Chrome 里用网页模仿一个 Chrome (Chrome App 本身是没有标签栏的),于是开始做一个 Chrome 一样的标签栏…
你们可以自己研究一下,点击加号之后从右边冒出新的标签、激活一个标签之后让原本的标签变回非激活状态、 拖动标签排序…这些经常用的交互,其实是一些很繁琐的逻辑实现的,那时候硬是在学校用草稿纸手写了两三页 (伪代码,不包括具体的 DOM API 调用)。
在那个年代,要实现像浏览器顶栏标签页这种卡片,需要切成左中右三张背景图,塞到一个 table 里。由于代码太过复杂 (其实还是因为那时候我不懂封装),于是寻找方案的时候发现那时候刚出来的 CSS3 可以用一个 div 实现我想要的效果,于是用上了当时最先进的 HTML5 和 CSS3…
写前端的过程中,终于觉得应该要把代码好好地组织一下,于是用上了当时还是很火的 MooTools,开始有了所谓的 OOP 的观念。上课偷偷用手机把 MooTools 的文档全啃完了,还提升了一下英语水平…
再后来,觉得 PHP 解析扒到的 HTML 和 JS 实在太费劲,又用上了当时刚出来的 NodeJS…
(三)
我所在的大学,上外网需要一个特殊的拨号器登录。这个拨号器写得很恶心,甚至还需要安装一些特殊驱动,不支持 Windows 8,也经常导致蓝屏。
一次宿舍楼网络故障,断网期间闲得无聊用 WireShark 看了看拨号器发出的数据,是 UDP,经过加密看不出原本是什么东西。
灵机一动,把登录密码换了一位再抓包看看,和之前的数据比较,确实只变了一个字节…于是一口气把键盘上能按的所有字符全部发了一遍,得到了一份 ASCII 范围内所有字符和加密之后的数据的对应关系。后来想想,好在它是个自己实现的线性加密算法。所谓线性加密,就是原文和密文可以完全一一对应,不受前后内容和其它因素影响。
凭着这份对应关系表观察拨号器发出的数据,基本上解读出了它的构造方式和所有字段的含义。剩下没办法用键盘打出来的字符怎么办?观察到登录报文里有一段是本机的网卡 MAC 地址,于是用工具把 MAC 改成我想知道的值,顺利得出 0x00 ~ 0xFF 的所有对应关系 (即便不知道它们的算法)。然后用 NodeJS 写了个山寨拨号器,网络恢复后马上验证,可行!
后来有用 Csharp 写了个可以实用的简易拨号器,不需要装驱动,单文件直接执行。
再后来换了 Mac,又跑去图书馆借了本 Objective-C 入门的书,照着书把拨号器重新写了一遍搞出了 Mac 版。
这两版拨号器似乎在学校论坛里流传至今。
------
后来,因为工作关系学了 Java,Elixir,C,C++ (对,绕了这么一大圈终于还是避不开它)…都是后话了,以后再说。