分类 行业思考 下的文章

什么是编程语言的自举?

自举,英文bootstrapping,意思就是自己可以启动或者编译自己,自己拽着自己的头发能把自己提起来,整个计算机系统从硬到软件最基础的部分都是自举的。听起来似乎哪儿不对,嗯...

以下是来自知乎轮子哥的解释,听起来更通俗易懂:

你想创造一门V语言而且用V语言来写V编译器的话,你得按照下面的方法做:
1、用C++把那个编译器(A)写出来,顺便留下很多测试用例。
2、用V语言把那个编译器写(B)出来,用A.exe来编译B,修改直到所有测试用例都通过为止。
3、B.exe来编译B自己得到B2.exe,修改直到B2.exe所有测试用例都通过为止。这是为了保证,就算B本身有很多bug,至少编译自己是没有bug的,从而你就可以走到第四步。
4、当你觉得有信心了,用A.exe把B编译一遍,就得到了B.exe。然后A的代码和A.exe都在也不需要存在了,删掉他们。以后你就不断的用B.exe来编译下一个版本的B就好了。就自举了。

那么为什么一定要完成自举,而不是使用最初始的编译器呢?可能当我们自己去设身处地地去想一下初始编译器的状态,就可以大致明白了:最初的编译器往往只在乎能正确工作,而不会考虑最优。举一个极端的例子,Donald Knuth即便再是大牛,如果要亲手编译每个WEB程序员编写的每个程序,那也是效率极其低下的。

一般来说,完成自举有如下的优点:

1. 这是一种对该语言的极好的测试;
2. 编译器的开发者只需掌握这一门语言即可,不需要再掌握其它语言;
3. 开发编译器的环境和使用这门语言开发的所有其它程序一致;
4. 对编译器后端的优化不仅会优化以后所有编译出来的其它程序的效率,也会优化编译器本身的效率。

实际上自举是有种哲学的思想在里面,是某种意义上的里程碑,一种语言能实现自举说明它已经可以摆脱其他语言实现自我迭代。正如道家所云:道生一,一生二,二生三,三生万物。自举最重要的节点就是完成那个道生一的过程,一门语言能自己编写自己的编译器,并用旧的编译器编译出新的编译器,实现自举才是该语言成熟的标志。

谷歌地图(Google Maps)

  谷歌地图提供了包括嵌入式API在内的各种各样的API,例如,Maps Image API、Places API、Web Services API和谷歌地图 API for Work。

  谷歌提供了非常详细的API文档和示例代码、函数库、SDK以及其他电子地图工具。同时为了方便开发者能够找到适合自己应用的地图API,谷歌还提供了API选择器。不过谷歌在今年三月份关闭了API服务。

  谷歌依然在为地图服务不断添加功能和做出改进,这将帮助谷歌地图在未来继续成为电子地图领域的“王者”。

必应地图(Bing Maps)

  微软旗下的必应地图同样是一个非常受欢迎的地图平台。为了完善必应地图,微软也正在持续添加新的功能,微软新增了数个城市的街景和高分辨率航空影像。同时,必应地图提供了三维城市数据。

  必应地图的文档同样非常详细和全面,虽然有些部分读起来让人费解。必应地图有很好的AJAX交互式SDK,准备了功能示例;还为开发者搭建JavaScript应用提供了代码片段。

  随着微软不断为必应地图平台添加更多的功能和特性,必应地图被开发者采用以及迎来全面普及应该会逐渐实现。

OpenLayers

  OpenLayers是一个开源的JavaScript库,可以利用WebGL、Canvas 2D以及其他HTML5的特性在当今主流的Web浏览器中渲染地图。

  OpenLayers支持OpenStreetMap、MapQuest、Stamen、必应等多种来源的瓦片地图,同时也能对GeoJSON、TopoJSON、KML、GML等多种地理矢量数据进行渲染。

  OpenLayers的文档组织得非常好,为开发者提供了丰富的内容。OpenLayers官方网站包含了大量现场演示,在GitHub上也有相当数量可用的代码样例。

  OpenLayers是一个非常受欢迎的地图库,这要归功于其开源的特性,以及对其他平台瓦片地图的支持。

OpenStreetMap(OSM)

  OSM主要是由数量庞大的志愿者团体完成的电子地图项目,用户可以免费创建和使用OSM的世界地图数据。有很多应用的地图都来自OSM的支持,例如Stamen的WaterColor,还有HitchWiki、OpenWeatherMap等。

  OSM API并不是将地图嵌入到网页中,而是允许原始地理数据被检索和/或被存储到OSM的数据库。OSM API的文档很全面,虽然所有的内容都以维基(wiki)页面的形式呈现。不过这也可以理解,因为OSM就是电子地图领域的“维基百科”。

  OSM用标签(tags)代表商业建筑、铁路等实体要素,并且每个标签都描述了地理属性。OSM还有很多地图要素,包括设施、建筑、公路、地名、商店和水路等。

MapQuest

  MapQuest有数个电子地图产品可以选择,包括面向网站、移动端、本地化、企业和开发者等不同的产品。MapQuest平台有两种类型:授权的和开放的。授权数据平台需要企业版本的许可才能使用,而开放数据平台仅需要获得免费开放许可就能使用。需要提醒的是,MapQuest开放数据平台的主要数据来源是由OSM提供的。

  MapQuest有专门为开发者服务的网站页面,包括精心设计的文档、地图生成器、静态地图向导、路径规划器以及其他开发工具。此外,MapQuest还提供JavaScript地图API,Open Web Services套件,开放的Leaflet插件等等。

  MapQuest成立的时间可以回溯至1967年,这有些出乎意料,甚至比谷歌存在的历史还要长。早在谷歌地图出现的2005年之前,MapQuest就开始向公众提供电子地图服务了。MapQuest平台相当完善和可靠,目前已经有数百万的网站访问用户和移动应用用户。

MapBox

  MapBox提供了一系列电子地图工具,可以将自定义的地图快速便捷地添加到应用中。MapBox是一个开源的平台,用户在这里可以设计纹理、插图等不同风格的地图,自定义标记样式,同时还具备矢量瓦片、静态地图、地理编码等功能。

  MapBox针对不同的用户群体准备了不同解决方案,从免费的入门级方案到大规模的企业级方案一应俱全。此外,MapBox面向教育领域还特别推出了解决方案。

  对于开发者而言,MapBox有API、SDK和其他开发工具可以选择;开发者能将动态地图和MapBox的技术与自己的应用结合。这个平台的特色功能是一种在线地图编辑工具,允许用户使用自己的数据快速建立自定义地图,支持导入的数据类型包括电子表格文件(CSV)、GeoJSON、KML、GPX。

  MapBox的API文档设计得同样精美,而且易于理解,当然,现场演示和代码示例也是不可或缺的,开发者可以在这些代码的基础之上开始构建自己的应用程序。

  相较于谷歌地图,成立于2010年的MapBox还略显生涩。他们一直在努力增加新的功能和令人着迷的特性,他们希望这样做能是其有别于其他的电子地图服务企业。

CARTO

  与MapBox一样,CARTO(原CartoDB)也是开源的平台,可以进行制图、分析和可视化,允许开发者创建Web端和移动端的地理信息应用。虽然CARTO成立的时间才不过三年(2012年4月成立),但它却赢得了一批诸如国家地理、NASA、英国卫报和Twitter等知名度颇高的用户。CARTO也有好几种不同级别的解决方案,从免费的基础级方案直至功能强大的企业级方案都有覆盖到。

  CARTO为开发者准备了JavaScript库(CartoDB.js)和一些API,这样开发者就能将漂亮的地图和地理可视化添加至自己的程序。

  CARTO的地图编辑器有直观的拖放式交互界面,这样用户就能快速地创建地图,并进行数据可视化。无论是平台还是编辑器,CARTO将它们的文档都做得非常通俗易懂。

  尽管CARTO相对是个新建立的平台,但它的增长速度非常快。在CARTO诸多功能中,最受欢迎的是被称为“Torque”的功能,它为可视化增加了动画效果,可以展示某个区域的数据随着时间变迁发生了什么变化。类似于Torque这样的特色功能,使CARTO与其他的电子地图和地理信息平台有了明显的区别。

Esri ArcGIS

  Esri主要面向企业级市场,它提供了一套完整的GIS平台,包括基于云服务的制图平台,ArcGIS桌面版,CityEngine,和MapStudio等等。同时,Esri也开始关注商业GIS市场,为消费者提供了一款免费的GIS浏览工具:ArcGIS Explorer Desktop。

  Esri有一个专门面向开发者的门户,内容包括ArcGIS API和SDK,开发文档,现场演示,代码示例等等。利用信用系统,Esri为非ArcGIS Online订阅用户的开发者制定了独立的定价体系。不过,这个信用价格体系有时候会出现混乱,因此,用一个简单些的方法定价会更可取。

概念

最近看到一篇文章,说到目前越来越多的初创企业开始实行精益开发,随查了下精益开发的主要内容,发现精益开发是基于丰田生产方式(TPS),由敏捷社区引入并发展的一套生成系统,感觉丰田真是一家伟大的公司,在日本这个人口拥挤的弹丸之地,却发明出了改变整个行业的系统性方法,不仅仅给本企业带来了巨大的利润,也给行业树立了标杆。

精益开发可以总结为如下七条原则:

  • 消除浪费
  • 增强学习
  • 尽量延迟决定
  • 尽快发布
  • 下放权力
  • 嵌入质量
  • 全局优化

可以看出来,精益开发的唯一目的就是使用最少的工作和资源,为客户创造尽量多的价值,任何不能为客户增加价值的行为都是不需要的,或者说如果某项活动或者流程可以被跳过或者取消也能达成最终的结果,那它就是浪费。在开发过程中作成但最终被废弃的代码是浪费;客户不经常使用的额外的处理和特性是浪费;令人员在多个任务间切换是浪费;等待其他任务是浪费;缺陷和低品质是浪费;不产生实际价值的、过度的管理也是浪费。


核心问题:沟通

软件开发在过去的几十年里都是大公司的专利,最近10年的快速发展,让很多小公司都有能力雇佣很少的开发人员就能完成相关的开发工作,从上图可以看出来,软件开发行业的基本流程也在不断的发生变化,从最开始传统公司的瀑布式开发,到一般互联网公司的迭代式开发,再到目前流行的敏捷开发、精益开发,这其中的每一个过程实质上都是为了解决沟通的问题。从瀑布到敏捷是为了解决组织内沟通的问题,从敏捷到精益不仅仅优化了组织内的沟通问题,还强化了与外部的关系。换句话说,精益结合了一部分的互联网思维。

沟通过程中最怕陷入互相扯皮推诿的境地,按照精益开发的原则一个有效的沟通应当是使得开发目标更加明确,开发人员之间的协作更加有效地进行。而如何有效的沟通呢?可以通过项目沟通计划来实现,个人感觉其作用非常重要,但却常容易被忽视,很多项目中不做完整的沟通计划,导致沟通混乱,轻则导致项目组工作效率低下,重则直接导致项目延期甚至以失败收尾。项目经理确定之初要做的第一件事就是确定整个项目的沟通计划,因为在沟通计划中描述了项目每个阶段每类沟通产生的进度计划、约定的处理方式和流程等等。只有建立起良好的沟通规则,才能把握好沟通,从而全面了解项目的各方面信息,不断推动项目的顺利进展。

Alpha

是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。

Beta

也是测试版,这个阶段的版本会一直加入新的功能,也可以对外让一部分内测用户使用测试,在Alpha版之后推出。

RC

Release Candidate,用在软件上就是候选版本;系统平台上就是发行候选版本。
RC版不会再加入新的功能了,主要着重于修复一些缺陷,消除一些错误。

GA

General Availability,正式发布的版本,在国外都是用GA来说明release版本的。

RTM

Release to Manufacture,是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。
但是和正式版本的主要程序代码都是一样的。

OEM

是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。

RVL

号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。

EVAL

而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。

RTL

Retail(零售版)是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。

α、β、λ常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。

在网上找了找,看到有三种方法:

一、在linux下,使用命令行:

find . -type d -name ".svn"|xargs rm -rf 

或者

find . -type d -iname ".svn" -exec rm -rf {} \; 


二、在windows下,使用命令行:
1、在项目平级的目录,执行dos命令:

xcopy project_dir project_dir_1 /s /i 

2、或者在项目根目录执行以下dos命令

for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn" 

第二种方法可以用来干很多事的,比如把代码中的.svn替换为任意其他文件名并在硬盘根目录下执行
3、添加注册表(亲自动手测试过)
可以将“快速删除SVN版本信息”命名增加到资源管理器的右键上,这样,鼠标点两下就能把选中目录下的所有.svn目录干掉了。
代码为:

Windows Registry Editor Version 5.00 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] 
@="快速删除SVN版本信息" 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command] 
@="cmd.exe /c D:\工具\批处理文件删除SVN版本信息.bat" 

将这段代码保存为一个.reg文件,双击确认导入注册表中不完整,后来自己手工添加。注意:文件“批处理文件删除SVN版本信息.bat”不能放 在有空格的文件夹下,确认删除时请看一下当前目录不要删除不该删的目录下的SVN版本信息。不知道怎么改进“cmd.exe /c D:\工具\批处理文件删除SVN版本信息.bat”。
批处理文件删除SVN版本信息.bat文件内容如下:

@echo off 
echo *********************************************************** 
echo 清除SVN版本信 息                                                                                               
echo *********************************************************** 
:start 
::启动过程,切换目录 
:set pwd=%cd% 
:cd %1 
echo 工作目录是:& chdir 
:input 
::获取输入,根据输入进行处理 
set source=: 
set /p source=确定要清楚当前目录下的.svn信息吗?[Y/N/Q] 
set "source=%source:"=%" 
if "%source%"=="y" goto clean 
if "%source%"=="Y" goto clean 
if "%source%"=="n" goto noclean 
if "%source%"=="N" goto noclean 
if "%source%"=="q" goto end 
if "%source%"=="Q" goto end 
goto input 
:clean 
::主处理过程,执行清理工作 
@echo on 
@for /d /r %%c in (.svn) do @if exist %%c ( rd /s /q %%c & echo    删除目录%%c) 
@echo off 
echo "当前目录下的svn信息已清除" 
goto end 
:noclean 
::分支过程,取消清理工作 
echo "svn信息清楚操作已取消" 
goto end 
:end 
::退出程序 
cd "%pwd%" 
pause

注:最后一种方法,如果出现错误,就打开注册表,找到对应的项,吧“cmd.exe /c D:\工具\批处理文件删除SVN版本信息.bat “直接写入注册表中即可使用

报文件没有关联错误,找到这个注册表项:[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
写入:“cmd.exe /c D:\工具\批处理文件删除SVN版本信息.bat “,注意路径
在使用的时候,不要在要清除的文件夹上右击,在要清除的文件夹里面的子文件夹上右击--》快速删除svn版本信息