go和swift
你生命中的有些东西终究会失去,比如我住了6年的陈寨,这个聚集了郑州十几万IT民工的地方,说拆就拆了。再比如我玩了3年的坦克英雄,这个带给我太多快乐的游戏,说停就停了。
编程对我而言是种爱好,我上学6年,工作14年,期间学会了二十多种编程语言,新潮如go和swift,生冷如F#和lisp,我都学过,至于热门的,编程语言排行榜上前14位的语言,我都会用。也许你觉得我是在吹牛,那就让我从头说起吧。
我上中学时开始学习编程,那时候没见过什么电脑,看书上说电脑是由主机显示器和硬盘驱动器组成的,我想当然地以为硬盘驱动器就是摆在电脑主机旁边的,跟打印机一样是个外设。那时候联想的电脑广告铺天盖地,然后对于偏远农村的我来说,却是永远也不敢奢望的。我只有一台小霸王学习机,接在一台黑白电视上,在上面运行basic程序。
basic应该是很多人学编程的入门语言吧,毕竟那时候还没有python. 那时候的basic,是用大写字母编写的,每行前面要加一个行号,程序是按行号执行的。每两个行号之间要有间隔,不然在两行中间插入代码时就麻烦了。很原始吧?很多年后当我把这段经历讲给我的老师听时,他说你知足吧,我们那时候是打纸带的,打错了就用胶水粘纸把一些孔给堵上,再用针扎出另一些孔来。
我那时候主要用basic解决一些数学问题,比如鸡兔同笼,百钱买百鸡等,还有就是求从1加到100的和。当时 PC上最流行软件应该是wps吧?我没见过,但我用学习机学会了五笔字型。学五笔时有次对我妈说话五笔比较难,我妈说那你先从简单的学起,先学一笔二笔。从我学习到工作,我妈对我的支持一直是我最大的动力。我上大学的时候买了一台二手电脑,那笔钱本来是家里准备购买彩电的,攒了好久,听我说想买电脑,我妈二话没说就把钱给我了。
买电脑时是我爸陪我去的,那时候郑州的科技市场还很简陋,两层楼的大厅,一楼卖各种各样的散件,二楼卖盗版软件。因为我们只有2000元,店主很为难,最后搜罗了很多二手配件,才勉强给我装了一台电脑。所以我的第一台电脑,CPU用的不是奔腾和赛扬,而是Cyrix 。Cyrix 这个名字可能很多人都没有听过,但我可以保证我没有拼错。电脑买回去之后我激动了好几天,村里很多人前来参观,因为那是我们全乡第二台电脑,第一台在乡政府。
我的第一台电脑运行的是windows 95系统,后来被我换成了98。我用这台电脑编写VB程序,用的Foxpro数据库,那时候听到VisualStudio 6.0发布的消息激动不已,花10块钱买了一张盘,视若珍宝。然后有一年暑假,我编写了一个简易的进销存程序,卖给我们乡里的一个商店,赚了200元。
在学校里,当然要学c和c++了,这两门语言我都学得很精通。但我说句老实话,我从业十几年从来没有用到过。那时候的编程界不光有VB,其时PoweBuilder已经开始没落,而Dephi风头正劲,刚好学校机房有Dephi,于是也学了一下。
互联网的风潮突然一下子吹遍了神州大地,那年暑假,我们县电信局建了第一个网络演示厅,试营业期间免费对公众开放。名字起得高大上,其实就是个网吧。那时郑州的网吧大概6块钱一小时,所以那个暑假我基本都泡在那个演示厅里。那时候QQ还不叫QQ,叫OICQ,商都网也不叫商都网,叫商都信息港。那个时候网络上没有太多的应用,基本上就聊天室和BBS在那里横行。我去得最多的就是澄心和碧海银沙。(说到这里插播一条寻人启事,有谁认识当年澄心聊天室的快乐小天使,就是商丘师院的丁今,请联系我,定酬谢500元QQ币。)然而当我满心欢喜地打算自己编写一个聊天室时,才发现我学的知识连一个最简单的留言板都做不出来。那时候asp,jsp,php之类网络编程已经大行其道,而我们在象牙塔内竟然浑然不觉。
思忖再三,决定报名参加一个java工程师的培训班,那时候国内比较牛的java培训机构一个是ACCP,另一个是NIIT。因为ACCP时间长费用高,所以果断报了NIIT。三个月的培训,其辛苦无人能知,经常为了调试一个程序,到凌晨才能入睡。然而功夫不负有心人,学完之后,应聘到郑州一家软件公司,开始了我的java生涯。
我们那个公司当时做的是移动的外包,公司里遇到的都是一些奇葩的人物。比如说我们技术总监刑工,一个五大三粗的汉子,偏偏留了一头大波浪的长卷发。再比如我们项目组长秦工,一个文弱的小女孩,偏偏领导了几个大男人,这个公司彻底颠覆了我对软件公司的认知。
开始工作的时候并不顺利,我虽然学了jsp,但在公司已经开始使用structs和hibernate,我完全不懂,还有什么dwr,也是一无所知。数据库的知识也非常欠缺,当时不会用join,为了把一个用户Id转成用户名,竟然在循环里查询数据库。好在前辈们都能及时指出这种问题,我也很快就能改正。
我那段时间在郑州呆了五年,从一个程序员成长为比较资深的java工程师。平时在公司工作,周末就去逛各种公园。碧沙岗,紫荆山,人民公园都留下了我的足迹。如果你静下心来看,郑州真是一个美丽的城市。不过有些时候我也会感觉很不爽,那时我住在燕庄,旁边就是省高级法院。法院周边的几条街上,经常会有一些含冤受屈的人们,带着简易的铺盖,露宿在街道两帝的地面上。他们的食物,基本上就是冷馒头。我有时候会给他们送些馒头和咸菜,也认识了几个上访了几十年的冤民。好吧,这咕噜掐了别播,冤不冤的其实也轮不到我来说。
俗话说饱暖思淫欲,工作稳定之后,就开始为自己的对象操心。当时我注册了一个中国交友中心,这家网站刚开始是免费的,后来收费每月10元。如果我不告诉你们,恐怕很少人知道它就是现在珍爱网的前身。然而在网上毕竟没有太多收获,有些是见一面就没有下文,有些根本就见不到人。记得有一次我约了人见面,去的时候突然下雨了,我捧着鲜花在雨中等了两个小时,姑娘却没有去,打电话也关机。第二天发个短信说她看天下雨了,以为我不会去所以也没去。
所谓踏破铁鞋无觅处,得来全不费功夫。有些你苦苦追寻的东西并不一定能得到,而有些你未曾想过的事情却很容易就实现了。那年春节我去我姑家探亲,恰逢她邻居家的一个姑娘来串门。随便问了一下,竟然是陕师大中文系的毕业生,在我们县的另一个乡的中学当教师。好吧省去中间细节,在我姑的撮合下,我们正式定亲。
都说程序员是高薪职业,他们说的没错但是写错了。中间那个辛是辛苦的辛,不是薪水的薪。程序员的工作高度辛苦,但薪资并不高。至少我是这么认为的,工作几年,存款居然不够付丈母娘的财礼。虽然丈母娘通情达理地减少了彩礼的金额,我妈又多少借了点外债把婚事促成了,但这件事情对我打击却很大。于是决定离开郑州,去上海谋一份高薪的职业。中国的地域差别在太大,同样的工作在不同的地方薪资完全不同,去上海的话工资至少可以翻一倍,我拮据的生活可能会因此有所缓解。
为了去上海的时候能够多一份保障,我开始学习.net。相对于java而言,.net是个后起之秀,虽然功能不如java强大,但是操作相当简单。我在没有任何老师,没有任何教材的情况下,就把.net学会了。总共也只花10块钱买两张盘,一张VS2005的安装盘,一张MSDN的文档盘。学习的过程也相当简单,就是照着msdn上的示例做一个购物网站。不这我到现在还不明白为什么那个例程要叫duwamish,www.feihuayl.cn字典上都查不到这个词,完全不知道什么意思。
在上海找工作用的是前程无忧的网站,我java和.net的职位都投了,最先被录用的却是.net.于是我编程生涯就此转折,从java一下子转到.net.录用我的是一家做远程教育的公司,老板是从美国回来创业的信息工程博士,据说之前是戴尔的核心工程师,技术牛得不得了。我被任命为技术部的经理,虽说是经理,不过属下也只有两个人,一个做C++的录制工具,一个做flash的播放器,我做.net的网站。
我刚去上海的时候,住在一个群租房里,一套三室两厅的房子,客厅被改成两间卧室,五间卧室总共住了男男女女18个人,生活极其不便。每个人的领地也就是自己那一张床板。上海的夏天潮湿闷热,想洗个澡都要等好久,早上起来上厕所也是要等好久的,18个人哪。后来媳妇听说我找到了工作,也把工作辞了来到上海。这样群租房是不能住了,于是就在张江和川沙的交界处租了一间房子。却不曾想上海的房租是付三押一的,付了房租之后,带的钱便所剩无几了。
房子是毛坯房,里面什么都没有,而我们却没有钱买家具。于是从附近的垃圾场里找了一张床板,又找了6个油漆桶,把油漆桶装满水当床腿,支起了一张床。然后又找了一张旧椅子,在上面放电磁炉做饭。床板只有80厘米,两个人平躺根本不够,只能两个人抱着侧卧。为了省点午饭钱,媳妇都是做好了饭给我送到公司,然后我们就在公司楼下的小公园里,两个人吃同一份饭。
当时的公司离张江公园很近,其实张江公园原来的名字叫樱花广场,每到四五月份,公园里就会开满绚丽的樱花。在樱花树下走过,有一种身在异国他乡的感觉。
我在上海工作一年多,然后公司就被北京的一家公司收购了,然后我又辗转来到了北京。当时住在回龙观和霍营交界的地方,然后公司却是在昌平。每天早上6点钟就要起床,乘公交到龙泽,然后坐公司班车,走八达岭高速去上班。也就是在那个时候,我学会了在车上睡觉,不管站着坐着都能睡着。
新公司主要做电子政务,用的.net+oracle,虽然我.net代码写的不怎么样,但毕竟项目经验还在,然后就在几个项目上担任项目经理。虽说是项目经理,但我们经常一个项目组就有十四五个人,跟我带3个人的团队是完全不同的。为了弥补短板,我报考了项目管理师,也就是高级项目经理的考试。虽然没有考过,但备考的过程中系统地学习了项目管理的知识。
在北京的日子苦中有甜,我们一有空闲就去游览各种皇家园林,清华园,燕园,园明圆,颐和园等等。有一次我们去十三陵水库游玩,恰好碰上当地苹果节的万人长走活动。然后在陡峭的山路上,我看到人群中有一个老人,坐在轮椅上,由他的老伴推着走。然后我就被感动了,腿不好的人都能参加长走比赛,我们还有什么理由不努力呢?
在北京工作一年多,公司在郑州成立办事处,我又被调回郑州。没过多久,有一家做电子商务的新公司成立,聘请我去当技术总监,公司的产品是基于php的开源软件修改出来的,于是我又转向php领域。这次转php没花多长时间,前后大概用了一个多星期,熟悉了php的语法后就开始进入工作了。 用php做电子商务类网站的话,比java和.net的快得多,而且网上有大量开源的 产品可以使用,用得不顺了,就随手改一下,从此见识到了开源的魅力。
后来公司的的产品做出来了,我有了一些空余时间,于是开始学习ruby www.yunfeizao.cn 和python,ruby和python是动态语言,所谓动态就是可以在运行期间改变语言的属性,比如在运行期间给类增加属性或者方法等,这些在java和C#中是做不到的,类的属性和方法必须在开发期间定义出来,运行期间不能改变。用动态语言编程的话,效率要高很多,因为实现同样的功能,动态语言的代码会少很多。自从学会了ruby和python之后,我基本上就没再用过java和C#了、ruby配合rails可以快速创建网站,而python做为通用脚本语言可以做任何事情 ,比如我在升级了程序后用它来迁移数据。
后来移动端渐热,又学习android和IOS以及WP,当时我集齐了三种操作系统的手机:小米、iphone和诺基亚的lumia,经常看到网上果粉和米粉互骂,我笑而不语。当时做IOS开发,用的还是晦涩难懂的obj-c,obj-c是一个非常反常规的开发语言,它的语法和其它语言都不一样,看着别扭,写着也别扭。当然,苹果肯定也知道这一点,于是推出了swift,当我接触到swift的时候,我觉得obj-c可以扔掉了,它的语法跟ruby和python一样简洁,而且功能比obj-c还要强大。
说到这里,不得不提一下那个老旧的C语言了,C语言诞生于上个世纪中期,已经是老旧不堪了,但是因为在系统程序领域没有有效的替代者,所以在开发系统级软件比如驱动程序时,还非得用它不可。当然,谷歌也知道这一点,于是推出了go.当我见到go的时候,简直震惊了。它的语法比java和C#还要优美,但是却可以开发系统软件,是C语言当之无愧对的替代者。而且go语言诞生在多核时代,所以它一开始就支持高并行开发,它的最小运行单位不是线程,是协程!
说到协程,不得不提一下erlang语言了,erlang是一门历史很悠久的语言,但直到多核时代才发挥出它的威力,在go出现之前,erlang是做高并发软件的首选。因为erlang是一门函数式语言,它没有变量,所以也就不存在多线和操作共享变量的问题。而且它的最小计算单位是协程,不是线程。这一点至关重要,因为一台普通的PC机可以开出最多5000个线程,却能开出多达10万个协程!然而erlang毕竟是一门函数式的语言,它的语法和命令式的语言完全不同。没有变量,没有循环,没有赋值语句,你在命令式语言中所获得的所有编程经验对它都不起作用。用erlang写程序,你不再是向计算机下达命令,而是在构造数学上的函数,进行模式匹配。
我用erlang编写过一些程序,苦不堪言,好在此时go语言出现了!http://new.debangyouxi.com 命令式的语言,最小计算单位是协程,那我还要erlang有什么用?
到后来我开始对编程语言产生了爱好,只要是我不会的语言,我都会抽空去学,哪怕学了完全没有什么用。这就是爱好,源自内心,没有任何功利驱使,这才是学好语言的根本。
在学习中,也遇到了很多困惑和迷茫。为了学习swift,我曾经花了一个星期的时间试图在我的华硕F5上面安装mac系统。折腾了N多遍,最后无果而终,不得已花钱买了一台苹果电脑。学习ruby的时候,还不知道用bundle, rails所需要的几十个gem我是一个一个下载安装的。学习Go语言的时候,想当然地以为那个gopath和其它语言的path一样,指向类库所在的位置,结果花了一个星期也没有运行起一个helloworld程序。
当然,最令我痛心的,是市场上并没有针对初学者的编程工具,那些专业级的开发工具都太复杂,有的需要下载安装插件,经常是插件版本和IDE版本不配,失败多次让人欲哭无泪;有的需要配置环境变量,各种path各种root让人如坠云雾。www.zhenloyl88.cn还有的体积庞大,为了运行一个示例程序要下几个G的开发工具。更有甚者,不能在windows系统上运行,为了学习一门编程语言,需要另外买个电脑!
痛心之余,我忽然发现了一个事实,那就是:我是一个程序员!IT民工也好,码农也罢(当然我更喜欢称自己为IT流浪人),这些都不能掩盖我是程序员的事实!程序员要使用开发工具,当然也可以制作开发工具!于是www.lafei333.cn我萌生了一个想法,要开发出一套针对初学者的编程工具,这个工具可以使用各种开发语言,一次安装即可运行,无须下载插件和SDK,无须设置环境变量,内置很多初学者需要的示例程序,这样不是很好吗?
既然心意已决,那就让我从现在开始吧,首先要给自己的作品起个名字,就叫流浪人IDE吧。英文名Outcast IDE,高端大气不用上档次 。第一版打算支持java、C# 、php、ruby、 python、 go 、siwft、 erlang 八种开发语言,后期再加入其它语言的支持。如果有人也有兴趣开发类似的编程工具,可以联系我,我们一起合作,为中国的软件产业贡献一份力量。
go和swift的更多相关文章
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
随机推荐
- [转] rtp h264注意点(FU-A分包方式说明)
总括: 一帧视频数据可以编码成多个H264的NALU, 每个NALU的开头为00 00 00 01: 一个RTP包可以传送 部分.一个或多个 NALU,看NALU的大小而定. 之前写过一篇文章,分析了 ...
- python-面向对象(三)——类的特殊成员
类的特殊成员 1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息,这是用于看片的神奇 """ def ...
- CSDN被黑几年后 我决定继续blogs
CSDN被黑几年后 我决定继续blogs 可惜了我那么多年的文章,全没了 希望这个博客顺风顺水---2015-12-23
- C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化
一.内联函数 常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
- 【转载】怎么理解Condition
注:本文主要介绍了Condition和ReentrantLock工具实现独占锁的部分代码原理,Condition能在线程之间协调通信主要是AbstractQueuedSynchronizer和cond ...
- java读取配置文件
java 读取文件可以用字节流和字符流. 由于一个汉字占两个字节,所以如果配置文件中有汉字,用字节流读取,会出现乱码. 用字符流则不会出现乱码. 配置文件 b.properties 文件如下: fam ...
- sso笔记
C:\Windows\System32\drivers\etc\hosts SSO:单点登录 1.使用Cookie解决单点登录 技术点: 1.设置Cookie的路径为setPath("/&q ...
- ListBox重绘
.NET Framework 类库 ListBox.ItemHeight 属性 当 DrawMode 属性设置为 DrawMode.OwnerDrawFixed 时,所有项具有相同的高度.当 Dra ...
- [每日一题] 11gOCP 1z0-052 :2013-08-31 数据库的存储结构....................................................A8
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/10784599 . 正确答案:A 将逻辑存储与物理存储分开是关系数据库范例的必要部分.关系数 ...
- 通过源码看android系列之multidex库
我们在开发项目时,喜欢引入好多的第三方包,大大的方便了我们的开发,但同时,因为android方法总数的限制,不能超过65k,然而呢,随着我们的开发,65k最终还是会超过,所以,google就给出了这个 ...