Authorwangchao

针对国内Android市场的打包发布统计工具汇总

摘要:国内的Android开发者上辈子都是折翼的天使,在辛辛苦苦写完代码处理了无数种分辨率,兼容性问题之后,还要面对可能要发布到400多家国内Android应用市场,各种应用中心,下载中心,论坛,QQ群,各种线下推广的巨大悲剧情况,再加上每周一个版本更新的大循环,简直暗无天日了,如果再没有一个很好的数据统计工具来衡量各个渠道的效果,那就真的永无出头之日了….下面就整理一些处理上述悲剧情况的工具,有些我正在用,有些我准备尝试,但本人也还在努力从上述悲剧中解脱出来….

一,数据统计分析工具 —— 友盟

老前辈们说“兵马未动,粮草先行”,数据统计其实跟粮草差不多,木有统计数据有时候真是不知道产品应该升级什么,所以我似乎去年刚开始写Android的时候就先挑了下到底用什么统计工具来统计Android程序,因为之前Web都用Google Analytics,所以那时候对刚听过的友盟和Google Analytics做了简单的对比:

当然,因为当时项目比较紧,我对比的很不仔细,Google Analytics Mobile也没有仔细用,只是觉得友盟提供的功能比我想得还要全,就直接用了,当然这两个现在应该都有了改进,我之后会Update下。

我自己用友盟主要是基于下面几个Feature:

1.渠道打包统计,这样方便分开渠道来计算用户增长,对于国内这种Market推广费用极高的地方,这个非常重要。

2.自动更新,毕竟多版本线的管理非常讨厌,自动更新能加快用户升级,虽然会有点有损用户体验….这个功能我看Google Analytics是没有的,需要另外加jar包实现,所以友盟这个挺方便的。

3.访问页面分析,这个很像Web Google Analytics里的那个,用起来比较熟,尤其是可以分版本来查看访问分析,可以清晰知道升级后效果如何,比如我们“校园招聘求职”Android App,自从把收藏夹升级为求职管理以后,这个Activity的平均停留时间从8s升到了20s,说明这个功能被一定程度上有效使用了。

当然,友盟还有一些需要改进的地方,我也经常意见反馈给他们,比如把本版本查看统计的层次升高,可以看到更详细的版本升级效果等,好在回复都比较快,而且态度比大多数国内互联网公司正常多了。

二,渠道打包工具 —— 友盟渠道打包工具

渠道就是我们平常说的Android市场,因为国内安卓市场数量庞大,我手头就有个@dicky 前辈整理的400多个市场的总表,不过我一直没能成功读完…..当然从数据统计看的话,估计有上传价值的也就20个市场左右,也就说起码需要打包20多次,这其实是个很费时间的事情,我们有两个方法解决(前提都是你有完整Eclipse项目代码):

1.使用Ant写打包脚本

这个方法网上很多了,就是需要为Ant打一个循环扩展包,可以参考《为Android应用增加渠道信息 自动化不同渠道的打包过程》,这个方法我没试过,因为不太熟悉Ant,就没用这个方法,不过这个方法适用情况比较广,估计在公司会用的比较多。

2.使用友盟渠道打包工具

我个人使用的这种方式,其实原理很简单,因为是For Windows Only的,就是用PowerShell跑个自动Ant打包过程,这里有两个需要注意:一是初次使用PowerShell如果有权限问题可以在网上查一下,就能解决,我就碰到了,忘了具体是什么了;二是一定要按Readme提供的填,我把Channel和Value写反了就识别不出来了….

当然,这是用来打包友盟渠道的,可能不具普遍性,不过有需求的话,稍微定制一下Ant脚本,或PowerShell脚本,应该都能满足的。

三,一站式应用上传工具 —— 抓猫

上传应用真是个繁琐,而又没办法的事情,谁让中国特色呢(配图抓猫版权所有)…..我这周就深受其痛,每个应用市场都有不一样的截图要求,说明要求,真是非常无语,不想吐槽,最近通过@felixonmars的推友找到了抓猫,可以一站提交10来个Market,并且在不断增加中,正准备尝试一下,优势的话,自己感觉有下面两个:

1.大部分市场可以绑定自己在各个Market的账号来发,这样不会太依赖工具,有自主权

2.来自各大市场的统计可以一站查看(不过这个我还是建议用友盟或者Analytics,国内Market的数据实测来看太不靠谱了)

虽然我可能会有保留的使用这种工具,但我很看好此类工具在国内市场的前景,这实在是一个刚性需求,说不定友盟也会尝试下的。

学习《百万级应用是怎样炼成的》中的推广之道

周末读了 @dicky 前辈的《从产品到推广告诉你:百万级用户是怎么练成的》,很是实战,尤其在推广这块,系统而量化的推广策略应该是基础战略,非常值得总结和研究,先记录一下,会在自己的产品推广中运用并检验。

Working With Bookmarks — 高效使用书签

本人高度网虫一枚,并且有强烈的“收藏分类综合症”,所以拥有超过2200个书签也不是什么奇怪的事…….

先炫耀下我的Chrome书签:

 

额……很多人第一次看到我的书签有超过5级目录的时候就轰掉了…….

当然我前几年开始用Chrome添加书签的时候也没想到会有这么夸张,但分类收藏后在找任何收藏网页的时候都是按照自己的分类去找的,也没感觉什么费劲的,反而觉得很方便。所以首先我向大家推荐分类的去收藏整理网页。

下面我给大家介绍一下怎么高效利用Bookmark:

1.Google Bookmarks

现在基本上我的生活完全离不开互联网,我的First Option Browser是Chrome,那么使用Chrome可以随时同步收藏夹到Google Accounts,那么不管我在哪里,下一个Chrome,同步我的书签,我就可以得到无差别网络浏览了

 

2.Neat Bookmarks For Chrome

Neat Bookmarks是款灵巧实用的Chrome侧置书签扩展,拥有强大的搜索功能,可以极快的搜索出你收藏夹里的网页,配合自己强大的书签,简直是大杀器了

 

3.Xmarks Bookmark Sync

当然你不可能用Chrome去干所有的事情,有时候IE,Firefox还是得用起来的,但这时候你要用你的书签怎么办呢,Xmarks提供一个跨浏览器,跨平台的解决方案,只需要注册一个账号,把书签同步上去,就能在任何浏览器,任何电脑上用起来自己的书签了。

 

4.Bookmark Sentry For Chrome

当拥有这么多链接收藏以后,自然不可能做到每个链接每隔一段时间就点击,那么可能这其中有一些已经变成死链了,Chrome Store里有工具可以把这些死链,坏链扫描出来,这个Bookmark Sentry就可以做到,当然我希望以后能出现更智能的产品,比如可以检测是不是危险地址等。(这个要多谢昊哥了,不过今天我在ChromeStore上已经找不到了….等找到再不链接吧,或者邮件我,我可以发过去)
PS:此插件带有广告,会在所有网页底部带他的Google Ad,有点狠,用完可以先禁用掉

 

5.【Deprecated】手机浏览的扩展工具(现在Chrome已经有Multiple Device支持)

上面的工具估计能解决在电脑上上高效使用书签的大部分需求了,那如果再蛋疼一些,电脑上看不够,在手机上也想看怎么办?当然,如果你有Android手机同步Chrome书签,或者你是Android 4.0用户可以装Chrome for Android,这当然不在话下,不过还有简单的方法,针对只是想把网页或链接在手机上查看的场景,又是Android用户,可以使用Chrome to phone 插件,发送链接到手机上。还想省流量?那么就用Spool吧,可以发送链接给自己或好友,然后设置只在Wifi下同步,那么用手机浏览连流量都省了!

 

好吧,我的蛋疼书签文就到此结束了,仅限“收藏网页控”使用…….

【Update – 20120219】更新了Bookmark Sentry & Chrome to phone & Spool

【Update – 20121223】更新了Neat Bookmarks For Chrome的安装地址,Deprecated手机扩展

 

Android:利用Google GeoCoding API替代Geocoder & 解决地址语言问题

摘要:Android定位开发中碰到GeoCoder间歇抽风问题,查证后得知可以用Google GeoCoding API来Workaround,这里记录此过程中遇到的两个收获吧,一是对这个Workaround给出自己的简单多线程解决方案,并未做太多封装。二是解决解析结果中地址的语言问题。

一.问题描述

最近在使用Android SDK中Geocoder类进行地址解析时发现有很大概率发生下面的悲剧…..

 java.io.IOException: Service not Available

具体原因有各种说法吧,也有文档

The Geocoder class requires a backend service that is not included in the core android framework. The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists.
意思应该是Geocoder类的使用描述在使用的前提是必须有 后台服务的支持,但是andorid sdk中不包含该服务的,Google可真够开玩笑的。在真机上不一定存在。据称可以用isPresent() 检测一下,就知道有没有了。

二.锁定解决方案

我在Android 的Google Code上发现各国的Developer都碰到这个问题了(http://code.google.com/p/android/issues/detail?id=8816),当然他们也提出了一些解决方案,简单总结下:

1.使用GoogleMap请求KML来解析位置(KML的Wiki传送门),当然要了解怎么使用KML的话,还得去http://code.google.com/apis/kml/documentation/,看看文档。具体的解决方案是使用URL请求,这是Issues里给的示例,Comment 20 by musicwit…@gmail.com

http://maps.google.com.tw/maps?f=q&source=s_q&hl=zh-TW&geocode=&q=%E5%8F%B0%E5%8D%97%E7%81%AB%E8%BB%8A%E7%AB%99&ie=UTF8&0&om=0&output=kml

2.像Comment21里说的我们可以直接利用http地址,实现地址查询:如:

根据地址查询经纬度:

http://maps.googleapis.com/maps/api/geocode/json?address=SFO&sensor=false

根据经纬度查询地址:

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false

bounds的作用

http://maps.googleapis.com/maps/api/geocode/json?address=Winnetka&sensor=false

http://maps.googleapis.com/maps/api/geocode/json?address=Winnetka&bounds=34.172684,-118.604794|34.236144,-118.500938&sensor=false

region的作用

http://maps.googleapis.com/maps/api/geocode/json?address=Toledo&sensor=false

http://maps.googleapis.com/maps/api/geocode/json?address=Tole

具体可以查看GoogleMap服务的文档http://code.google.com/intl/zh-CN/apis/maps/documentation/geocoding/

因为项目时间的原因,我果断采用了第二种我比较熟悉的方法。

三.多线程完成HTTP地址解析

这方面的教程网上已经有很多了,我就不列出我的方案了,给大家一个传送门吧

四.中文地址问题

我的需求是由地理位置解析出中文地址,但由Google Map  GeoCoding API返回的确实英文地址,我试过在HTTP请求中带Charset参数,但并没有成功返回中文…..

在网上搜了一大圈以后才发现一个解决方法,原来可以直接在Url里带language=zh-CN参数,服了,估计经常使用GoogleAPI的才知道吧,也没发现相关文档,示例:

http://maps.google.com/maps/api/geocode/json?latlng=39.9727642,116.3753401&sensor=true&language=zh-CN

可以返回中文了,Problem Done!

Update 2011-09-22:使用使用Google GeoCoding API过程的问题

千万别觉得这就结束了,下面列举在实际使用Google GeoCoding API过程中发现的几个问题:

1.HTTP连接不太稳定,注意多次尝试,而不是仅发送一次请求就使用,而要判断在没有返回值的时候尝试一定次数。

2.有时候Google GeoCodingAPI会返回错误格式的地址,记得做处理,例如:

请求:返回formatted_address字段,Url:

Request URL: http://maps.googleapis.com/maps/api/geocode/json?latlng=30.511381,114.401893&sensor=false&language=zh-CN

返回: “formatted_address”: “中国湖北省武汉市洪山区鲁磨路118号 邮政编码: 430079”

崩溃了,居然错带了邮编…..所以还要人工处理下,防止以上情况的发生!

参考文献:

Android Google Code Issue 8816: service not available

Android:用户定位User Localtion和利用HTTP解析地址—GeoCoding

Google Geocoding API 开发语言问题

【转】陈皓:程序员技术练级攻略

这篇文章取名叫Build Your Programming Technical Skills,我实在不知道用中文怎么翻译,但我在写的过程中,我觉得这很像一个打网游做任务升级的一个过程,所以取名叫“技术练级攻略”,题目有点大,呵呵,这个标题纯粹是为了好玩这里仅仅是在分享Mailper和我个人的学习经历。(注:省去了我作为一个初学者曾经学习过的一些技术(今天明显过时了),如:Delphi/Power builder,也省去了我学过的一些我觉得没意思的技术Lotus Notes/ActiveX/COM/ADO/ATL/.NET ……)
前言
你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)
建议:

  • 不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。
  • 回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。
  • 一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。
  • 一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。

:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:

  • 现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。
  • 越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。
  • 微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《Windows编程革命史》

所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。
启蒙入门
1、学习一门脚本语言,例如Python/Ruby
可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:

  • 处理文本文件,或者csv(关键词 python csv, python open, python sys)读一个本地文件,逐行处理(例如word count,或者处理log)
  • 遍历本地文件系统(sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
  • 跟数据库打交道(python sqlite),写一个小脚本统计数据库里条目数量
  • 学会用各种print之类简单粗暴的方式进行调试
  • 学会用Google (phrase, domain, use reader to follow tech blogs)

为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。
2、用熟一种程序员的编辑器(不是IDE)和一些基本工具

  • Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
  • Source Insight (或 ctag)

使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。
3、熟悉Unix/Linux Shell和常见的命令行

  • 如果你用windows,至少学会用虚拟机里的linux,vmware player是免费的,装个Ubuntu吧
  • 一定要少用少用图形界面。
  • 学会使用man来查看帮助
  • 文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
  • 学会使用一些文本操作命令 sed/awk/grep/tail/less/more …
  • 学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…
  • 了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
  • 了解正则表达式,使用正则表达式来查找文件。

对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。
4、学习Web基础(HTML/CSS/JS)+服务器端技术(LAMP)
未来必然是Web的世界,学习Web基础的最佳网站是W3School。

  • 学习HTML基本语法
  • 学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)
  • 学会用 Firefox + Firebug 或 Chrome 查看你觉得很炫的网页结构,并动态修改。
  • 学习使用Javascript操纵HTML元件。理解DOM和动态网页。网上有免费的章节,足够用了。。
  • 学会用 Firefox + Firebug 或 Chrome 调试 Javascript 代码(设置断点,查看变量,性能,控制台等)
  • 在一台机器上配置Apache或Nginx
  • 学习PHP,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。
  • 把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)
  • 跟完一个名校的网络编程课程(例如:http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php )不要觉得需要多于一学期时间,大学生是全职一学期选3-5门课,你业余时间一定可以跟上
  • 学习一个Javascript库(例如jQuery或ExtJS)+ Ajax(异步读入一个服务器端图片或者数据库内容)+ JSON数据格式。
  • HTTP: The Definite Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)
  • 做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)
  • 买个域名,租个空间,做个自己的网站。

进阶加深
1、 C语言和操作系统调用

  • 重新学C语言,理解指针和内存模型,用C语言实现一下各种经典的算法和数据结构。推荐《计算机程序设计艺术》、《算法导论》和《编程珠玑》。
  • 学习(麻省理工免费课程)计算机科学和编程导论
  • 学习(麻省理工免费课程)C语言内存管理
  • 学习Unix/Linux系统调用(Unix高级环境编程),了解系统层面的东西。
    • 用这些系统知识操作一下文件系统,用户(实现一个可以拷贝目录树的小程序)
    • 用fork/wait/waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。
    • 用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。
    • 学会使用gcc和gdb来编程和调试程序(参看我的《用gdb调试程序》)
    • 学会使用makefile来编译程序。(参看我的《跟我一起写makefile》)
    • IPC和Socket的东西可以放到高级中来实践。
  • 学习Windows SDK编程(《Windows程序设计》 ,《MFC Windows程序设计》)
    • 写一个窗口,了解WinMain/WinProcedure,以及Windows的消息机制。
    • 写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。
    • 学习如何使用MSDN查看相关的SDK函数,各种WM_消息以及一些例程。
    • 这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。
    • 不用太多于精通这些东西,因为GUI正在被Web取代,主要是了解一下Windows 图形界面的编程。

2、学习Java

  • Java 的学习主要是看经典的Core Java 《Java核心编程技术》和《Java编程思想》(有两卷,我仅链了第一卷,足够了,因为Java的图形界面了解就可以了)
  • 学习JDK,学会查阅Java API Doc http://download.oracle.com/javase/6/docs/api/
  • 了解一下Java这种虚拟机语言和C和Python语言在编译和执行上的差别。从C、Java、Python思考一下“跨平台”这种技术。
  • 学会使用IDE Eclipse,使用 Eclipse 编译,调试和开发Java程序。
  • 建一个Tomcat的网站,尝试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小项目试着用JSP和Servlet实现一下。

3、Web的安全与架构

  • 学习HTML5,网上有很多很多教程,以前酷壳也介绍过很多,我在这里就不罗列了。
  • 学习Web开发的安全问题(参考新浪微博被攻击的这个事,以及Ruby的这篇文章)
  • 学习HTTP Server的rewrite机制,Nginx的反向代理机制,fast-cgi(如:PHP-FPM)
  • 学习Web的静态页面缓存技术。
  • 学习Web的异步工作流处理,数据Cache,数据分区,负载均衡,水平扩展的构架。
  • 实践任务:
    • 使用HTML5的canvas 制作一些Web动画。
    • 尝试在前面开发过的那个Web应用中进行SQL注入,JS注入,以及XSS攻击。
    • 把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站。

4、一些开发工具

  • 学会使用SVN或Git来管理程序版本。
  • 学会使用JUnit来对Java进行单元测试。
  • 学习C语言和Java语言的 coding standard 或 coding guideline。(我N年前写过一篇关C语言非常简单的文章——《编程修养》,这样的东西你可以上网查一下,一大堆)。
  • 推荐阅读《代码大全》《重构》《代码整洁之道

高级深入
1、C++ / Java 和面向对象
我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“C++学习信心图”和“21天学好C++”

  • 学习(麻省理工免费课程)C++面向对象编程
  • 读我的“如何学好C++”中所推荐的那些书至少两遍以上(如果你对C++的理解能够深入到像我所写的《C++虚函数表解析》或是《C++对象内存存局(上)(下)》,或是《C/C++返回内部静态成员的陷阱》那就非常不错了)
  • 然后反思为什么C++要干成这样,Java则不是?你一定要学会对比C++和Java的不同。比如,Java中的初始化,垃圾回收,接口,异常,虚函数,等等。
  • 实践任务:
    • 用C++实现一个BigInt,支持128位的整形的加减乘除的操作。
    • 用C++封装一个数据结构的容量,比如hash table。
    • 用C++封装并实现一个智能指针(一定要使用模板)。
  • 设计模式》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)
  • 实践任务:
    • 使用工厂模式实现一个内存池。
    • 使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。
    • 使用命令模式实现一个命令行计算器,并支持undo和redo。
    • 使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。
  • 学习STL的用法和其设计概念 -容器,算法,迭代器,函数子。如果可能,请读一下其源码。
  • 实践任务:尝试使用面向对象、STL,设计模式、和WindowsSDK图形编程的各种技能
    • 做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
    • 做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。
  • 学习C++的一些类库的设计,如: MFC(看看候捷老师的《深入浅出MFC》),Boost, ACE, CPPUnit,STL (STL可能会太难了,但是如果你能了解其中的设计模式和设计那就太好了,如果你能深入到我写的《STL string类的写时拷贝技术》那就非常不错了,ACE需要很强在的系统知识,参见后面的“加强对系统的了解”)
  • Java是真正的面向对象的语言,Java的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佳语言了(参看Java中的设计模式)。
  • 推荐阅读《Effective Java》 and 《Java解惑
  • 学习Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是学习Java的设计,如IoC等。
  • Java的技术也是烂多,重点学习J2EE架构以及JMS, RMI,等消息传递和远程调用的技术。
  • 学习使用Java做Web Service (官方教程在这里)
  • 实践任务: 尝试在Spring或Hibernate框架下构建一个有网络的Web Service的远程调用程序,并可以在两个Service中通过JMS传递消息。

C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:

  • 深究C++(我深究C/C++了十来年了)
  • 学习Java的各种设计模式。

2、加强系统了解
重要阅读下面的几本书:

  • UNIX编程艺术》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。
  • UNIX网络编程(卷1):套接字联网API》这是一本看完你就明白网络编程的书。重要注意TCP、UDP,以及多路复用的系统调用select/poll/epoll的差别。
  • TCP/IP详解卷1:协议》-这是一本看完后你就可以当网络黑客的书。了解以太网的的运作原理,了解TCP/IP的协议,运作原理以及如何TCP的调优。
  • 实践任务:
    • 理解什么是阻塞(同步IO),非阻塞(异步IO),多路复用(select, poll, epoll)的IO技术。
    • 写一个网络聊天程序,有聊天服务器和多个聊天客户端(服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast)。
    • 写一个简易的HTTP服务器。
  • UNIX网络编程.卷2:进程间通信》信号量,管道,共享内存,消息等各种IPC……这些技术好像有点老掉牙了,不过还是值得了解。
  • 实践任务:
    • 主要实践各种IPC进程序通信的方法。
    • 尝试写一个管道程序,父子进程通过管道交换数据。
    • 尝试写一个共享内存的程序,两个进程通过共享内存交换一个C的结构体数组。
  • 学习《Windows核心编程》一书。把CreateProcess,Windows线程、线程调度、线程同步(Event, 信号量,互斥量)、异步I/O,内存管理,DLL,这几大块搞精通。
  • 实践任务:使用CreateProcess启动一个记事本或IE,并监控该程序的运行。把前面写过的那个简易的HTTP服务用线程池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事件,或是记录某个窗口的按键。
  • 有了多线程、多进程通信,TCP/IP,套接字,C++和设计模式的基本,你可以研究一下ACE了。使用ACE重写上述的聊天程序和HTTP服务器(带线程池)
  • 实践任务:通过以上的所有知识,尝试
    • 写一个服务端给客户端传大文件,要求把100M的带宽用到80%以上。(注意,磁盘I/O和网络I/O可能会很有问题,想一想怎么解决,另外,请注意网络传输最大单元MTU)
    • 了解BT下载的工作原理,用多进程的方式模拟BT下载的原理。

3、系统架构

  • 负载均衡。HASH式的,纯动态式的。(可以到Google学术里搜一些关于负载均衡的文章读读)
  • 多层分布式系统–客户端服务结点层、计算结点层、数据cache层,数据层。J2EE是经典的多层结构。
  • CDN系统 – 就近访问,内容边缘化。
  • P2P式系统,研究一下BT和电驴的算法。比如:DHT算法。
  • 服务器备份,双机备份系统(Live-Standby和Live-Live系统),两台机器如何通过心跳监测对方?集群主结点备份。
  • 虚拟化技术,使用这个技术,可以把操作系统当应用程序一下切换或重新配置和部署。
  • 学习Thrift,二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。
  • 学习Hadoop。Hadoop框架中最核心的设计就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。
  • 了解NoSQL数据库(有人说可能是一个过渡炒作的技术),不过因为超大规模以及高并发的纯动态型网站日渐成为主流,而SNS类网站在数据存取过程中有着实时性等刚性需求,这使得目前NoSQL数据库慢慢成了人们所关注的焦点,并大有成为取代关系型数据库而成为未来主流数据存储模式的趋势。当前 NoSQL数据库很多,大部分都是开源的,其中比较知名的有:MemcacheDB、Redis、Tokyo Cabinet(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。

写了那么多,回顾一下,觉得自己相当的有成就感。希望大家不要吓着,我自己这十来年也在不断地学习,今天我也在学习中,人生本来就是一个不断学习和练级的过程。

—————————————————分割线———————————————

这篇文章我个人比较喜欢,对整理自己的思路很有帮助,特地收藏一下~~