程序员和工程师有什么不一样?

程序员

我刚刚工作的时候,面试官曾经跟我说:好好干两年,可以迅速从程序员成长为工程师。当时我觉得太诧异了,从很多招聘启示来看,“程序员”不就等于“工程师”吗,只是“工程师”更好听一些而已。等我工作久了,才知道“程序员”和“工程师”真的是不一样的——程序员只写程序,工程师写能在现实世界中创造价值的程序。

可惜,很多软件开发人员未必清楚两者的差别,甚至做了很久也只算程序员而不算严格意义上的工程师。所以我就自己的观察和经验,谈谈程序员和工程师的差别。

第一,工程师不写黑箱程序。

“程序=数据结构+算法”,这个著名的公式大家都知道,不幸的是,它不适合描述工程领域或者现实世界的程序。有很多程序,数据结构和算法都写得很棒,功能足够强大,系统足够复杂,但是——它很难调试,一跑起来就无法停止,而且谁也不知道程序现在到底在干什么,里面发生了什么。

别觉得好笑,我遇到过很多工作三四年甚至五六年的开发人员,仍然不停地生产黑箱程序:出现问题的第一反应是直接杀掉进程重启(天哪你们的程序不能安全关闭的吗?)。当然还有更生猛的,直接用开发机连上生产数据库(防火墙上开个洞)去调试。

你说他们技术不好吗?明明各种技术问题也能搞定。你说他们没有系统意识?做过的程序也不简单。但是,他们做的充其量只能叫“程序”,而不是工程上成熟的“系统”。

怎样的程序不是黑箱?你需要考虑它的层次划分,你需要考虑哪些(功能之外的)运行信息必须暴露和记录,以什么方式暴露记录,你甚至还需要考虑这些暴露和记录对性能的影响,以及程序需要对外提供什么操纵接口……当你把这一切都考虑清楚,写出能够让运行细节“尽在掌握中”的程序的时候,你的一条腿就迈进了“工程”的大门。

这方面,互联网和软件开发的大厂会更加关注一些,但也不是说个人就毫无追求的空间了。网络爬虫大家都会写,大家也都知道如果要数据抓得准,调试起来很麻烦。我有个朋友在某大厂写过一套“可视化”的爬虫,可以用逐步操纵语句的执行,迅速定位问题所在。这种水平的工程师,属于可遇而不可求的类型,每次说起来大家仍然啧啧称赞。

第二,工程师注意实现和接口分离。

Java面试的一道经典问题是:请描述抽象类和接口的区别。通常,大家都会知道“接口”和“实现”要分离。不幸的是,很多人理解的“接口”,只是侠义的特定语言提供的interface,而没有考虑“接口”真正的含义。

接口的真正含义是什么?计算机最擅长处理额是信息,它可以让信息脱离现实的障碍高速流动起来。如果说“实现”是干脏活累活,“接口”就是发出干脏活累活指令的窗口。脏活累活干一遍就足够了,但发指令的窗口却可以有千千万万。

更具体一点说,完成功能的是程序员,完成功能并且设想它会在什么情况下使用,并且让人方便使用的,是工程师。我见过不少这样的程序:登录会话一开始放在本地内存里没问题,到了要切换到数据库里方便会话转移就得大兴土木,虽然要做的其实仍然只是存取而已;程序自动加载的数据出了问题,就根本不能手动加载;以前手动加载的数据,改成自动加载就要推倒重来……

有没有接口意识,能不能真正区分接口和实现,这是区分程序员和工程师的一大标识。

第三,工程师注重功能的逻辑联系。

很多系统都在不断的变化和改进过程中,程序员看到的是功能点,工程师看到的是功能点之上的逻辑。

任何系统当然都是由若干功能构成的。但在功能点之上,还需要一张有逻辑意义的大网,才能把功能点组合起来,把复杂度降低,成为大家能理解的对象。最简单的“登录”,就包含数据输入、数据验证、登录信息记录等等功能,“登录”是这些功能的逻辑集合,也是理解这些功能的基础。

随着时间的推移,业务的增长,新功能可能越来越多,比如用户数据的加载,对好友的通知,广告的推送准备等等。这些功能实现起来当然都容易(因为很具体),但功能堆积的后果是复杂度急剧上升,因为功能之间的逻辑联系被切断了。所以,工程师必然需要思考,这些功能应该怎么组合,放到哪些具有逻辑意义的动作——比如“登录”里去?正是经过这样持续不断的思考,系统的复杂度才能够被一直维持在较低的水平,容易让大家理解。

这个例子看起来很简单,但做起来却没那么容易。我有时看到复杂的系统操作手册,简直让人哭笑不得:1) 点这里;2) 点那里;3) 输这个…… 这些操作对应的逻辑意义那么准确,分明就该是一次性自动完成的啊,把它们割裂开来的后果大大提高了系统的复杂度,既不方便维护,也不方便操作。最后来擦屁股的,只能是开发人员自己。

我经常反思自己接受的教育,在学校里写程序,和工作了写程序,有那么一点相同,但又好像完全两回事,到底有什么不同,只有亲自体会、思考了才能明白,所以我想把自己的所见所感写出来。悟性好的有机会接受很好训练的同学,估计不需要了解这些。但对于没有这样条件的同学,但愿我的这点念叨能给你们一点帮助。

百度站长平台工具链接自动推送方法

怎样才能使新更新的文章更快的被百度收录,是所有站长最头疼的事情之一,而百度在这一块问题上为了我们站点也算是煞费苦心,如若不然也不会提供了“链接提交”工具。

百度给出的链接提交方式有以四下种

1、主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。

2、自动推送:最为便捷的提交方式,请将自动推送的JS代码部署在站点的每一个页面源代码中,部署代码的页面在每次被浏览时,链接会被自动推送给百度。可以与主动推送配合使用。

3、sitemap:您可以定期将网站链接放到sitemap中,然后将sitemap提交给百度。百度会周期性的抓取检查您提交的sitemap,对其中的链接进行处理,但收录速度慢于主动推送。

4、手动提交:一次性提交链接给百度,可以使用此种方式。

优缺点:

由于手工提交有点累人,效果慢所以不推荐、sitemap则方便轻松些,适合比较“懒惰”或者时间紧迫的站长、而主动推送虽然是实时的,也能保证新链接可以及时被百度收录,但对于新手站长会比较麻烦,也有很多站长在根据百度给出的示例,在制作推送工具时却一直不成功,所以也不推荐这个。

自动推送是最为便捷的提交方式,只要把自动推送的JS代码部署在站点的每一个页面源代码中,部署代码的页面在每次被浏览时,链接会被自动推送给百度,这方法既方便又简单,再配合sitemap定时提交效果特別好的,所以推荐这个。

自动推送代码如何安装使用?

站长需要在每个页面的HTML代码中包含以下自动推送JS代码:

<script>

(function(){

var bp = document.createElement(‘script’);

bp.src = ‘//push.zhanzhang.baidu.com/push.js’;

var s = document.getElementsByTagName(“script”)[0];

s.parentNode.insertBefore(bp, s);

})();

</script>

如果站长使用PHP语言开发的网站,可以按以下步骤操作:

1、创建名为“baidu_js_push.php”的文件,文件内容是上述自动推送JS代码;

2、在每个PHP模板页文件中的 标记后面添加一行代码:

<?php include_once(“baidu_js_push.php”) ?>

为什么自动推送可以更快的将页面推送给百度搜索?

基于自动推送的实现原理问题,当新页面每次被浏览时,页面URL会自动推送给百度,无需站长汇总URL再进行主动推送操作。

借助用户的浏览行为来触发推送动作,省去了站长人工操作的时间。

自动推送和链接提交有什么区别?

已经在使用链接提交的网站还需要再部署自动推送代码吗?

二者之间互不冲突,互为补充。已经使用主动推送的站点,依然可以部署自动推送的JS代码,二者一起使用。

什么样的网站更适合使用自动推送?

自动推送由于实现便捷和后续维护成本低的特点,适合技术能力相对薄弱,无能力支持全天候实时主动推送程序的站长。

站长仅需一次部署自动推送JS代码的操作,就可以实现新页面被浏览即推送的效果,低成本实现链接自动提交。

同时,主动推送和自动推送代码配合使用,二者互不影响。

Android SDK 在线更新镜像服务器资源

Android SDK 在线更新镜像服务器资源:

大连东软信息学院镜像服务器地址:

  • http://mirrors.neusoft.edu.cn 端口:80

北京化工大学镜像服务器地址:

  • IPv4: http://ubuntu.buct.edu.cn/ 端口:80
  • IPv4: http://ubuntu.buct.cn/ 端口:80
  • IPv6: http://ubuntu.buct6.edu.cn/ 端口:80

上海GDG镜像服务器地址:

  • http://sdk.gdgshanghai.com 端口:8000

中国科学院开源协会镜像站地址:

  • IPV4/IPV6: http://mirrors.opencas.cn 端口:80
  • IPV4/IPV6: http://mirrors.opencas.org 端口:80
  • IPV4/IPV6: http://mirrors.opencas.ac.cn 端口:80

腾讯Bugly 镜像:

  • http://android-mirror.bugly.qq.com 端口:8080
  • 腾讯镜像使用方法: http://android-mirror.bugly.qq.com:8080/include/usage.html
  • 使用方法
  • sdk-manager-proxy-settings
    1. 启动 Android SDK Manager ,打开主界面,依次选择『Tools』、『Options…』,弹出『Android SDK Manager – Settings』窗口;
    2. 在『Android SDK Manager – Settings』窗口中,在『HTTP Proxy Server」和「HTTP Proxy Port』输入框内填入上面镜像服务器地址和端口,并且选中『Force https://… sources to be fetched using http://…』复选框。设置完成后单击『Close』按钮关闭『Android SDK Manager – Settings』窗口返回到主界面;
    3. 依次选择『Packages』、『Reload』。

Android的系统架构

Android的系统架构采用了分层架构的思想,如图1所示。从上层到底层共包括四层,分别是应用程序程序层、应用框架层、系统库和Android运行时和Linux内核。

Android系统体系

图1:Android系统架构图

每层功能简要介绍如下:

一 应用程序层

该层由运行在Dalvik虚拟机(为Android专门设计的基于寄存器的Java虚拟机,运行Java程序的速度更快)上的应用程序组成。该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。

二 应用程序框架层

该层主要由View、通知管理器(NotifICation Manager)、活动管理器(Activity Manager)等由开发人员直接调用的组件组成。该层是Android应用开发的基础,开发人员大部分情况是在和它打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。

三 系统库和Android运行时

Java本身是不能直接访问硬件的。要想让Java访问硬件,必须使用NDK才可以。NDK是由C/C++语言编写的库,这些程序也是该层的主要组成部分。系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.net、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。该层是对应用框架提供支持的层。

四 Linux内核

Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。

总结:

1 Android的系统架构采用分层架构的思想,架构清晰,层次分明,协同工作。

2 Android的系统架构不仅从宏观上认识了Android系统,同时,也给我们的学习与实践指明了方向。若是从事Android应用开发,那应该研究Android的应用框架层和应用程序层;若是从事Android系统开发,那应该研究Android的系统库和Android运行时;若是从事Android驱动开发,那应该研究Android的Linux内核。总之,找准切入点,实践出真知。

博客大事记

在2014年的某一天,在网上浏览各个关于互联网的网站,于是突发奇想,自己要是有一个域名这该多棒呀,于是我就抱着试一试的心态,在万网的搜索框中搜索xudadi,由于默认是.com的域名,再者.com是国际通用域名,于是就这样我就注册了。

然后最开始的时候是在学校学了html++css+div,纯静态的、然后主页是做出来,但是发表文章的页面也准备做,但是随后想了一想,这每一个文件都是单独的,修改起来好麻烦啊,然后就在网上看看别人的网页怎么设计的,偶然间看到了博客程序,没错就是zblog,那个时候用的是asp版的,这期间我也测试了zblog for php版的,感觉php版的跑得挺快,运行挺流畅的,于是就想尝试php版,由于asp生成静态页面时间要长一点,所以就下定决心下次购买php的空间。我心想等我的asp空间到期之后我就用php空间,但是在万网我看到了可以更换系统,于是我就换了,换了之后感觉还是蛮好的。

wordpress

但是用过一段时间之后,看到别人的博客那么高大上,特别的酷,自己也去了解了一下,之后才知道原来用的是wordpress,wordpress是国外著名的博客程序,在国内是非常受欢迎的,也是最流行的博客程序之一,然后我就又换成了wordpress,用了差不多有一年了,但是wordpress的后台加载速度太慢了,实在是忍受不了,在2015年10月18日,我又重新装回zblog for php版。2015年11月10日又重新安装回wordpress