作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

计算机很早就走入了我的生活。小学时,家里放一台联想“天琴”的电脑。它霸气的音箱造型,拉风的麦克风,诡异的遥控器,都震撼着我小小的心灵。那时的小屁孩,会花一个下午,努力研究左键、右键和开始菜单。初中时,游戏成了电脑的代名词。在报摊买大众软件,在商场地下室买碟,在家里输入一下午的"show me the money",乐此不疲。到了高中,电脑和网络相连。上网看新闻,泡论坛,阅读最早的网络文学,再加上小小的下载窗口。在网吧里待一夜,染上满身的油烟味,早上再战战兢兢回家,似乎是叛逆期最深的记忆了。

然而,这都是门外汉的徘徊。我始终没有踏入计算机的大门:既没有计算机相关的学历,也没有在IT业的工作。想想自己这些年在大门外晃来晃去,和计算机失之交臂的经历,也觉得有趣。聊作此文,博客官一笑。如果你也是和我一样徘徊的门外汉,希望我的学习经历能对你有些参考价值。

编程就是Debug

或许是之前玩电脑太凶,所以就把电脑当作纯粹的娱乐工具。大学时坚决选了个和计算机靠不上边的专业:物理。为了向父母表示拳拳的向学之心,自己连电脑都没带,就屁颠屁颠的研究欧拉方程去了。

但门外汉最开始接触编程,还是来自本科的课程。本科时有五门和计算机相关的课程:

  • C语言。使用的是谭浩强的《C程序设计》。对教材不置可否,但这门课给我的印象是:程序员就是解决bug。再也不想转系到计算机学院了。
  • 算法与数据结构。当时的教材是高教版的《算法与数据结构》。书里的例子使用的是伪代码。现在觉得这不算差,但当时上机的时候总是一堆bug要改。对C语言不算熟练,所以很多bug不容易解决。
  • Fortran。教材是《FORTRAN语言》,谭浩强是作者之一。这是门古老的语言,但在科学运算方面运用很广,所以作为理科生必须要学习。和C语言给我的感觉类似,就是要不停的debug。痛苦极了。
  • 微机原理。教材是《微型计算机原理与接口技术》。主讲硬件原理和汇编语言。当时用UltraEdit加插件,来运行汇编语言。学习汇编时,也只是试着用了用加法、移动之类的语法,没有具体的项目。
  • 数据库。教材是本绿皮的,题目忘记了。还能记住的,就是不断分拆关系型数据库的表格,直到它满足某个范式。基本上没有太多实践。

回顾大学的这些课程,其实都算是计算机科学中相当重要的内容。问题是,这些课程都比较基础,偏理论,却轻实践。教材和老师的讲解也是如此,对于年轻人来说,乐趣少了些。具体的项目基本没有,自己很难看到效果。一时看不出这些课程的用途,就为了应付考试,将就的学吧。大好时光,还是挥洒在篮球场上吧。

大学期间还是出于兴趣,看了些Java和web的内容。Java看了《Core Java》的第一卷,但自己没有电脑,没法实践。还没把握到面向对象的精髓,就被轰然到来的期末备考裹挟走了。为了给女孩子惊喜,跟着w3cschool的教程,尝试做网站。学了html,css和php,但没钱租服务器,最后做了俩静态页面,差强人意。窘迫的年轻人。

创造才是乐趣

大学最后一年做毕业论文,阴差阳错,选了个三维重构流体运动的课题。这和计算机图形学沾上了边。当时用IDL来做图形处理和矩阵运算,可以很快看到算法对图形的处理效果。我一下子来了兴趣,连着两个假期都扑在这上面。空闲的时候,也是调程序、实验算法,看看结果如何。尽管导师评价代码太乱,不适合搞计算机,自己也是嘿嘿一笑,依然乐在其中。为了解决问题,自己还学了不少计算机图形学的内容,比如《图像处理、分析与机器视觉》。果然,兴趣是最大的学习动力。

在这期间,另一个重要的变化是接触Linux。为了做课题,我把自己的笔记本带到了学校。三年不见,这个本已经从曾经的“高富帅”变成了“矮挫熊”。听从朋友的建议,忍痛把操作系统换成了Ubuntu,以减少死机的次数。网上填个表,就有一张免费的cd寄到,顿时体验到开源的优越性。用了一段时间,总体感觉是,免费的果然差一些。比如Ubuntu上的办公软件就差office好多,更别说做的惨不忍睹的游戏了。唯一方便的是,学校里有一个Ubuntu镜像,所以可以以无比迅速的节奏来下载更新或者安装应用。真正享受Linux,还要等到未来。

需求的倒逼

本科毕业时,那所大学校园里快要溢出来的科研气氛给我打了鸡血。内心想的纯粹是搞科学研究。所以没怎么犹豫,就开始读博了。做的课题是流体计算相关的,因此需要在高性能电脑上并行运行。

高性能计算机的运行环境和普通电脑完全不同。首先,它安装的是CentOS,还没有任何的图形华界面,文本方面基本用vim。其次,由于要和别人竞争使用,要比较清楚的估计自己的工作量、所需的CPU数目和运行时间,还要查看空闲的资源,见缝插针。一个任务交上去,短的跑几天,长的跑几个星期。懒惰是创新的动力。为了不操那么多心,就写了些bash脚本来处理这些繁杂的事务,或者监视集群的运行状况。这才意识到bash和Linux工具(比如sed, awk, grep...)的好处。这期间读了《Linux Administration Handbook》,非常全面的一本Linux参考书,写的也很有趣。最后,高性能计算机是个并行的集群,需要了解并行算法和接口,所以读了《Parallel Programming with MPI》。

仅仅了解Linux的管理是不够的。在计算机上运行的是数值模型。这些数值模型是C语言和Fortran混合编写的。为了理解程序,认真读了《The C Programming Language》,《Expert C Programming》,《Fortran 90/95 for Scientists and Engineers》。这几本书的好处是简洁且重点清晰,读起来不费劲。然而,在集群上的编译连接很成问题。主流的编程可以依赖StackOverflow。但数值运算的很多问题太偏门,在网上找不到资料。一封询问邮件发出去,基本得不到什么有用的回应。几番折腾下来,心里发狠,还不如自己读源代码,自己解决问题。因此读了《Advanced Programming in the Unix Environment》(好一本厚书,读的过程不堪回首,读完真的学到很多)。这些基础知识帮助我解决了不少编译连接方面的问题。

数据处理是另一个问题。在工作最开始使用的是Matlab,但研究所里的许可证有限,有时要等到别人用完了才能去用。再加上Matlab的许多附加包价格不菲,也让我觉得不方便。有一次和教授聊起这个问题,教授说,那你可以试试Python。Python,以及Python下的Numpy和Scipy包可以满足我的需求。而且想想,Python是免费的,这无论对我,还是对未来可能雇佣我的研究机构来说,都可以省下笔钱。这么看,学Python是个蛮靠谱的事情。《Learning Python》是本很全面的Python教材。

写作的动力

出于分享Python心得的目的,也为了打发空闲的时间,开始在博客园写“Python快速教程”。写到标准库,发现Linux系统知识是必备的背景知识,所以重开了“Linux的概念与体系”系列。另一方面,在写网络相关的包时,发现自己对网络协议方面了解太少。《TCP/IP Illustrated》里有对网络协议非常全面的介绍。这里面学到的东西,也构成我的“协议森林”系列的文章基础。自己的文章得到认可,也更有动力去多看多学了。

在和其它博主交流时,感觉到自己在基础知识方面,还是有很大的差距。毕竟自己是个非计算机专业的“杂牌军”。一是对面向对象的本质了解不够,这在《Thinking in Java》里脑补了一下。二是算法和数据结构的知识太肤浅,因此基于《Data Structures and Algorithm Analysis in C》,自己实现了一系列的经典算法。三是没有设计数据库的实际经验,正在努力做一个项目,来获得实际经验。看看这三点,都是本科时候学残了的课。不是不报,时候未到啊。

门外汉的徘徊

从小屁孩时,拿着鼠标小心翼翼的点“开始”,自己还真的时徘徊了许久。幸运的是,人生几个转弯下来,我依然喜欢编程,喜欢静静的计算机打交道。有一件两件真心喜欢的事情,就是很大的幸福了。和许多专业的计算机人士相比,我依然是一个门外汉。这种门外汉的徘徊,其实感觉不坏。作为门外汉,没有要成为最好的负担,只用随心所欲的享受技术和写作。

作为门外汉,好的技术书和好的工具会有很大的影响。毕竟,门外汉说来就来,也说走就走,很容易一时的不享受而放弃。不能不说,是那些文辞优美又简洁的技术书,让我感受到编程的优美。而Ubuntu下方便免费的编程环境,铺平了自由尝试的道路。现在更方便的是,我们可以在互联网上找到各种各样的教程、资料和公开课。许多云平台工具也是免费的。所以,即时是门外汉,也可以很容易跨过那道大门。这是门外汉最好的时代了。

最后附一张图,开启我门外汉生活的电脑:

门外汉的IT的更多相关文章

  1. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制

    第一部分 基本设计 目前最新版本的C#驱动MongoDB-CSharpDriver-2.2.3,比之前的版本更新比较大,在网上很难找到这个版本的相关C#操作资料,以下都是个人自发研究.测试的,如有雷同 ...

  2. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制之 第二部分

    第二部分 尝试解决BulkWrite(List<WriteModel<T>>)问题 在上次发表的文章中,得到了一些很好的反馈,真切体会到写博文的好处,有高人指出两大问题,具体可 ...

  3. 排序算法门外汉理解-Shell排序

    #include <stdio.h> /* 希尔排序 基本思想:希尔排序又称为缩小增量排序,对简单插入排序的优化. (外部分组gap,组内部插入排序! ! ) 特点:一种不稳定的排序 */ ...

  4. 一个门外汉的理解 ~ Faster R-CNN

    首先放R-CNN的原理图 显然R-CNN的整过过程大致上划分为四步: 1.输入图片 2.生成候选窗口 3.对局部窗口进行特征提取(CNN) 4.分类(Classify regions) 而R-CNN的 ...

  5. IDC门外汉-单线、双线、智能多线、BGP的区别

    一.单线在此不多说,不是电信,就是网通机房,是,2005年前的机房情况: 二.双线:上般是从2004年到2008年用此方法较多,此今还有不少在用此法如下: 双线主机 有单IP和单网卡双IP地址,双网卡 ...

  6. 从门外汉到腾讯Android高级研发——一个半路出家菜鸟的艰难逆袭之路

    我是在去年3月份加入腾讯公司,目前是腾讯公司某技术部门里面的一个小负责人,年薪月薪大税后概30K,谈不上多么厉害,但在回想自己半路出家学习编程,从一个销售到现在终于进入中国互联网顶尖公司,还是有些许感 ...

  7. 网络通信IO的演变过程(二)(一个门外汉的理解)

    2.NIO 当与别人谈论NIO时,一定要弄清楚别人说的NIO是指哪个含义? NIO有2种含义: 1.NonBlocking IO,基于操作系统谈 2.Java New IO,基于Java谈 我们这里主 ...

  8. 网络通信IO的演变过程(一)(一个门外汉的理解)

    以前从来不懂IO的底层,只知道一个大概,就是输入输出的管道怼到一起,然后就可以传输数据了. 最近看了周志垒老师的公开课后,醍醐灌顶. 所以做一个简单的记录. 0 计算机组成原理相关 0.1. 计算机的 ...

  9. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

随机推荐

  1. js基础

    JavaScript组成: ◆ECMASCript    语法标准◆DOM         JS操作网页(api) ◆BOM   操作浏览器的api JavaScript特点: ◆简单易用    == ...

  2. Codeforces Round #384 (Div. 2)D-Chloe and pleasant prizes

    D. Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input ...

  3. [LintCode] Trailing Zeroes 末尾零的个数

    Write an algorithm which computes the number of trailing zeros in n factorial. Have you met this que ...

  4. Windows下搭建Spark+Hadoop开发环境

    Windows下搭建Spark+Hadoop开发环境需要一些工具支持. 只需要确保您的电脑已装好Java环境,那么就可以开始了. 一. 准备工作 1. 下载Hadoop2.7.1版本(写Spark和H ...

  5. Daily Scrum02 12.17

    软件发布到了最后的阶段,大家都在抓紧时间DEBUG,美化界面,做各种测试…… 大家抓紧最后一把劲,一起努力冲最后一下,努力吧! Member 任务进度 下一步工作 吴文会 会议组织 会议总结,发表博客 ...

  6. 基于AngularJS的企业软件前端架构[转载]

    这篇是我参加QCon北京2014的演讲内容: 提纲: 企业应用在软件行业中占有很大的比重,而这类软件多数现在也都采用B/S的模式开发,在这个日新月异的时代,它们的前端开发技术找到了什么改进点呢? B/ ...

  7. 一个基于Orchard的开源CRM --coevery简介

    Coevery是开源的.NET Web平台项目,力争打造一个开放而鲁棒的CRM系统,采用Orchard架构,并使用AngularJS改善页面体验.作为一个后发优势的CRM 产品,Coevery 具有一 ...

  8. 四核驱动的三维导航—淘宝新UI(设计篇)

    前面有一篇博客说到了淘宝UWP的"四核驱动的三维导航—淘宝新UI(需求分析篇)",花了两周的时间实现了这个框架,然后又陆陆续续用了三周的时间完善它. 多窗口导航,与传统的导航方式的 ...

  9. Java Socket

    什么是Socket Socket的概念很简单,它是网络上运行的两个程序间双向通讯的一端,既可以接收请求,也可以发送请求,利用它可以较为方便地编写网络上数据的传递. 所以简而言之,Socket就是进程通 ...

  10. 多线程中的锁系统(二)-volatile、Interlocked、ReaderWriterLockSlim

    上章主要讲排他锁的直接使用方式.但实际当中全部都用锁又太浪费了,或者排他锁粒度太大了,本篇主要介绍下升级锁和原子操作. 阅读目录 volatile Interlocked ReaderWriterLo ...