代码生成器python
1. 闲话python 45: 浅谈生成器yield
生成器似乎并不是一个经常被开发者讨论的语法,因此也就没有它的大兄弟迭代器那么着名。大家不讨论它并不是说大家都已经对它熟悉到人尽皆知,与之相反,即使是工作多年的开发者可能对生成器的运行过程还是知之甚少。这是什么原因导致的呢?我猜想大概有以下几点原因: (1)运行流程不同寻常,(2)日常开发不需要,(3)常常将生成器与迭代器混淆。 生成器的运行流程可以按照协程来理解,也就是说 返回中间结果,断点继续运行 。这与我们通常对于程序调用的理解稍有差异。这种运行模式是针对什么样的需求呢? 一般而言,生成器是应用于大量磁盘资源的处理。 比如一个很大的文件,每次读取一行,下一次读取需要以上一次读取的位置为基础。下面就通过代码演示具体看看生成器的运行机制、使用方式以及与迭代器的比较。
什么是生成器?直接用文字描述可能太过抽象,倒不如先运行一段代码,分析这段代码的运行流程,然后总结出自己对生成器的理解。
从以上演示可以看出,这段代码定义了一个函数,这个函数除了yield这个关键字之外与一般函数并没有差异,也就是说生成器的魔法都是这个yield关键字引起的。 第一点,函数的返回值是一个生成器对象。 上述代码中,直接调用这个看似普通的函数,然后将返回值打印出来,发现返回值是一个对象,而并不是普通函数的返回值。 第二点,可以使用next对这个生成器对象进行操作 。生成器对象天然的可以被next函数调用,然后返回在yield关键字后面的内容。 第三,再次调用next函数处理生成器对象,发现是从上次yield语句之后继续运行,直到下一个yield语句返回。
生成器的运行流程确实诡异,下面还要演示一个生成器可以执行的更加诡异的操作:运行过程中向函数传参。
返回生成器和next函数操作生成器已经并不奇怪了,但是在函数运行过程中向其传参还是让人惊呆了。 调用生成器的send函数传入参数,在函数内使用yield语句的返回值接收,然后继续运行直到下一个yield语句返回。 以前实现这种运行流程的方式是在函数中加上一个从控制台获取数据的指令,或者提前将参数传入,但是现在不用了,send方式使得传入的参数可以随着读取到的参数变化而变化。
很多的开发者比较容易混淆生成器和迭代器,而迭代器的运行过程更加符合一般的程序调用运行流程,因此从亲进度和使用熟悉度而言,大家对迭代器更有好感。比如下面演示一个对迭代器使用next方法进行操作。
从以上演示来看,大家或许会认为迭代器比生成器简单易用得太多了。不过,如果你了解迭代器的实现机制,可能就不会这么早下结论了。python内置了一些已经实现了的迭代器使用确实方便,但是如果需要自己去写一个迭代器呢?下面这段代码就带大家见识以下迭代器的实现。
在python中,能被next函数操作的对象一定带有__next__函数的实现,而能够被迭代的对象有必须实现__iter__函数。看了这么一段操作,相信大家对迭代器实现的繁琐也是深有体会了,那么生成器的实现是不是会让你觉得更加简单易用呢?不过千万别产生一个误区,即生成器比迭代器简单就多用生成器。 在实际开发中,如果遇到与大量磁盘文件或者数据库操作相关的倒是可以使用生成器。但是在其他的任务中使用生成器难免有炫技,并且使逻辑不清晰而导致可读性下降的嫌疑。 这大概也能解释生成器受冷落的原因。不过作为一个专业的开发者,熟悉语言特性是分内之事。
到此,关于生成器的讨论就结束了。本文的notebook版本文件在github上的cnbluegeek/notebook仓库中共享,欢迎感兴趣的朋友前往下载。
2. 如何更好地理解Python迭代器和生成器
Python这门语言中,生成器毫无疑问是最有用的特性之一。与此同时,也是使用的最不广泛的Python特
性之一。究其原因,主要是因为,在其他主流语言里面没有生成器的概念。正是由于生成器是一
个“新”的东西,所以,它一方面没有引起广大工程师的重视,另一方面,也增加了工程师的学习成本,
最终导致大家错过了Python中如此有用的一个特性。
我的这篇文章,希望通过简单易懂的方式,深入浅出地介绍Python的生成器,以改变“如此有用的特性却
使用极不广泛”的现象。本文的组织如下:在第1章,我们简单地介绍了Python中的迭代器协议;在本文
第2章,将会详细介绍生成器的概念和语法;在第3章,将会给出一个有用的例子,说明使用生成器的好
处;在本文最后,简单的讨论了使用生成器的注意事项。
1. 迭代器协议
由于生成器自动实现了迭代器协议,而迭代器协议对很多人来说,也是一个较为抽象的概念。所以,为了
更好的理解生成器,我们需要简单的回顾一下迭代器协议的概念。
1. 迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个
StopIteration异常,以终止迭代
2. 可迭代对象就是:实现了迭代器协议的对象
3. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函
数等)使用迭代器协议访问对象。
举个例子:在所有语言中,我们都可以使用for循环来遍历数组,Python的list底层实现是一个数组,所
以,我们可以使用for循环来遍历list。如下所示:
>>> for n in [1, 2, 3, 4]:
... print n
但是,对Python稍微熟悉一点的朋友应该知道,Python的for循环不但可以用来遍历list,还可以用来遍历
文件对象,如下所示:
>>> with open(‘/etc/passwd’) as f: # 文件对象提供迭代器协议
... for line in f: # for循环使用迭代器协议访问文件
... print line
...
为什么在Python中,文件还可以使用for循环进行遍历呢?这是因为,在Python中,文件对象实现了迭代
器协议,for循环并不知道它遍历的是一个文件对象,它只管使用迭代器协议访问对象即可。正是由于
Python的文件对象实现了迭代器协议,我们才得以使用如此方便的方式访问文件,如下所示:
>>> f = open('/etc/passwd')
>>> dir(f)
['__class__', '__enter__', '__exit__', '__iter__', '__new__', 'writelines', '...'
2. 生成器
Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产
生结果。这也是生成器的主要好处。
Python有两种不同的方式提供生成器:
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 2/5
1. 生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一
个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2. 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个
结果列表
2.1 生成器函数
我们来看一个例子,使用生成器返回自然数的平方(注意返回的是多个值):
def gensquares(N):
for i in range(N):
yield i ** 2
for item in gensquares(5):
print item,
使用普通函数:
def gensquares(N):
res = []
for i in range(N):
res.append(i*i)
return res
for item in gensquares(5):
print item,
可以看到,使用生成器函数代码量更少。
2.2 生成器表达式
使用列表推导,将会一次产生所有结果:
>>> squares = [x**2 for x in range(5)]
>>> squares
[0, 1, 4, 9, 16]
将列表推导的中括号,替换成圆括号,就是一个生成器表达式:
>>> squares = (x**2 for x in range(5))
>>> squares>>> next(squares)
0
>>> next(squares)
1
>>> next(squares)
4
>>> list(squares)
[9, 16]
Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象
的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 3/5
议,所以,我们可以直接这样计算一系列值的和:
>>> sum(x ** 2 for x in xrange(4))
而不用多此一举的先构造一个列表:
>>> sum([x ** 2 for x in xrange(4)])
2.3 再看生成器
前面已经对生成器有了感性的认识,我们以生成器函数为例,再来深入探讨一下Python的生成器:
1. 语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在
于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2. 自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for
循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,
在没有值可以返回的时候,生成器自动产生StopIteration异常
3. 状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,
以便之后从它离开的地方继续执行
3. 示例
我们再来看两个生成器的例子,以便大家更好的理解生成器的作用。
首先,生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大
数据量处理,将会非常有用。
大家可以在自己电脑上试试下面两个表达式,并且观察内存占用情况。对于前一个表达式,我在自己的电
脑上进行测试,还没有看到最终结果电脑就已经卡死,对于后一个表达式,几乎没有什么内存占用。
sum([i for i in xrange(10000000000)])
sum(i for i in xrange(10000000000))
除了延迟计算,生成器还能有效提高代码可读性。例如,现在有一个需求,求一段文字中,每个单词出现
的位置。
不使用生成器的情况:
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text, 1):
if letter == ' ':
result.append(index)
return result
使用生成器的情况:
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 4/5
def index_words(text):
if text:
yield 0
for index, letter in enumerate(text, 1):
if letter == ' ':
yield index
这里,至少有两个充分的理由说明 ,使用生成器比不使用生成器代码更加清晰:
1. 使用生成器以后,代码行数更少。大家要记住,如果想把代码写的Pythonic,在保证代码可读性的前
提下,代码行数越少越好
2. 不使用生成器的时候,对于每次结果,我们首先看到的是result.append(index),其次,才是index。
也就是说,我们每次看到的是一个列表的append操作,只是append的是我们想要的结果。使用生成
器的时候,直接yield index,少了列表append操作的干扰,我们一眼就能够看出,代码是要返回
index。
这个例子充分说明了,合理使用生成器,能够有效提高代码可读性。只要大家完全接受了生成器的概念,
理解了yield语句和return语句一样,也是返回一个值。那么,就能够理解为什么使用生成器比不使用生成
器要好,能够理解使用生成器真的可以让代码变得清晰易懂。
4. 使用生成器的注意事项
相信通过这篇文章,大家已经能够理解生成器的作用和好处。但是,还没有结束,使用生成器,也有一点
注意事项。
我们直接来看例子,假设文件中保存了每个省份的人口总数,现在,需要求每个省份的人口占全国总人口
的比例。显然,我们需要先求出全国的总人口,然后在遍历每个省份的人口,用每个省的人口数除以总人
口数,就得到了每个省份的人口占全国人口的比例。
如下所示:
def get_province_population(filename):
with open(filename) as f:
for line in f:
yield int(line)
gen = get_province_population('data.txt')
all_population = sum(gen)
#print all_population
for population in gen:
print population / all_population
执行上面这段代码,将不会有任何输出,这是因为,生成器只能遍历一次。在我们执行sum语句的时候,
就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。所以,上面的代码不
会有任何输出。
因此,生成器的唯一注意事项就是:生成器只能遍历一次。
5. 总结
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 5/5
本文深入浅出地介绍了Python中,一个容易被大家忽略的重要特性,即Python的生成器。为了讲解生成
器,本文先介绍了迭代器协议,然后介绍了生成器函数和生成器表达式,并通过示例演示了生成器的优点
和注意事项。在实际工作中,充分利用Python生成器,不但能够减少内存使用,还能够提高代码可读性。
掌握生成器也是Python高手的标配。希望本文能够帮助大家理解Python的生成器
3. 浠涔堟槸Python涓镄勭敓鎴愬櫒鎺ㄥ煎纺
Python涓链変竴绉岖揣鍑戠殑璇娉曪纴鍙浠ラ氲繃涓涓寰鐜鍜屾浔浠舵瀯寤轰竴涓鍒楄〃锛岃繖绉嶈娉曞彨锅氩垪琛ㄦ帹瀵煎纺锛坙ist comprehension锛夛细 my_list = [ f(x) for x in sequence if cond(x) ] 绫讳技鍦帮纴鎴戜滑鍙浠ラ氲繃瀛楀吀鎺ㄥ煎纺
Python涓链変竴绉岖揣鍑戠殑璇娉曪纴鍙浠ラ氲繃涓涓寰鐜鍜屾浔浠舵瀯寤轰竴涓鍒楄〃锛岃繖绉嶈娉曞彨锅氩垪琛ㄦ帹瀵煎纺锛坙ist comprehension锛夛细
my_list = [ f(x) for x in sequence if cond(x) ]
绫讳技鍦帮纴鎴戜滑鍙浠ラ氲繃瀛楀吀鎺ㄥ煎纺锛坉ictionary comprehension锛夊垱寤哄瓧鍏革纴阃氲繃闆嗗悎鎺ㄥ煎纺锛坰et comprehension锛夊垱寤洪泦钖堬细
my_dict = { k(x): v(x) for x in sequence if cond(x) }
my_set = { f(x) for x in sequence if cond(x) }
锛堣繖涓璇娉曟敮鎸佹洿锷犲嶆潅镄勬搷浣滐纴浣呜繖閲屼粎浣灭ず渚嬶级
链钖庯纴浣犺缮鍙浠ヤ娇鐢ㄧ被浼肩殑璇娉曞垱寤轰竴涓鐢熸垚鍣锛
my_generator = ( f(x) for x in sequence if cond(x) )
涓嶈繃锛岃繖骞朵笉鍙锅氱敓鎴愬櫒鎺ㄥ煎纺锛岃屾槸鍙锅氱敓鎴愬櫒琛ㄨ揪寮忥纸generator expression锛夈备负浠涔堜笉鍙鍓嶈呭憿锛熷傛灉鍓崭笁涓璇娉曢兘琚绉颁负钬沧帹瀵煎纺钬濓纴涓轰粈涔堢敓鎴愬櫒杩欎釜涓嶅彨锻锛
PEP 289 钬斺 鐢熸垚鍣ㄨ〃杈惧纺 镄勬渶钖庣粰鍑轰简璇︾粏镄勫囨敞锛屽叾涓鎸囧嚭Raymond Hettinger璧峰埯鎻愯浣跨敤钬灭敓鎴愬櫒鎺ㄥ煎纺锛坓enerator comprehension锛夆濅竴璇嶏纴钖庢潵Peter Norvig鎻愬嚭浜嗏灭疮璁℃樉绀猴纸accumulation displays锛夆濓纴钖庢潵Tim Peters鎺ㄨ崘浜嗏灭敓鎴愬櫒琛ㄨ揪寮忊濊繖涓
钖嶈瘝銆备絾鏄瀹冨苟娌℃湁钖嶈瘝鍑虹幇浜呜繖镙风殑鍙桦寲銆
EarlGrey锛氢笂闱㈡彁鍒扮殑杩椤嚑浣嶉兘鏄澶х墰鍟婏紒鍏蜂綋澶у跺彲浠ヨ胺姝屼竴涓嬨
镓浠ユ垜鍦═witter涓婃彁鍑轰简杩欎釜闂棰桡细
python 链変釜鎴戜笉镍傜殑闂棰桡细涓轰粈涔埚畠浠琚绉颁负钬灭敓鎴愬櫒琛ㄨ揪寮忊濓纴钥屼笉鏄钬灭敓鎴愬櫒鎺ㄥ煎纺钬濓纻
Guido镄勫洖绛旀寚鍑轰简镙稿绩铡熷洜锛
鎺ㄥ煎纺涓寮濮嫔睘浜庘滃瓧闱㈤噺鏄剧ず锛坙iteral display锛夆濊繖涓姒傚康銆傝岀敓鎴愬櫒琛ㄨ揪寮忎笉鏄涓绉嶆樉绀猴纸display锛夈
Matt Boehm钖庢潵镓惧埌浜员im Peters鎻愬嚭钬灭敓鎴愬櫒琛ㄨ揪寮忊濅竴璇岖殑闾浠讹纴鍏朵腑璁茶堪浜嗕竴浜涚粏鑺傦细
璇诲畬闾浠跺悗锛屾垜瀵硅繖涓闂棰樼殑鐞呜В镟存繁浜嗐傞栧厛锛屼负浠涔堜细浣跨敤钬沧帹瀵煎纺钬濓纸comprehension锛変竴璇嶏纻Tim鍦ㄩ偖浠朵腑鎸囧嚭锛岃繖涓璇嶆潵婧愪簬闆嗗悎璁轰腑镄勬帹瀵煎叕鐞嗭纸Axiom of Comprehension锛夛纴瀹冩寚镄勬槸阃氲繃瀵瑰彟涓涓闆嗗悎镄勫厓绱犲簲鐢ㄦ煇涓璋撹瘝锛坧redicate锛屽嵆𨱒
浠讹级钥岀粍鎴愭柊镄勯泦钖堛傝繖鍜屽悜鍙︿竴涓搴忓垪涓镄勫厓绱犲簲鐢ㄦ煇涓𨱒′欢浠庤岀敓鎴愬垪琛ㄧ殑锅氭硶闱炲父绫讳技銆
EarlGrey锛氭垜涔嫔墠鐪嫔埌寰埚氱炕璇戜负钬滆В鏋悫濓纴鐪嫔埌杩欓噷镓嶈夊缑钬沧帹瀵煎纺钬濇墠鏄镟村嗳纭镄勮存硶銆
姝e侴uido镓鎸囧嚭镄勶纴Python镄勮捐¤呭綋镞舵洿娉ㄩ吨镄勬槸鏄剧ず锛岃屼笉鏄𨱒′欢銆傗沧樉绀衡濅竴璇嶅湪杩欓噷镒忓懗镌浠g爜镄勮娉旷湅涓婂拰瀹冨皢鍒涘缓镄勬暟鎹缁撴瀯寰埚儚銆傚垪琛ㄦ樉绀猴纸鍒楄〃鎺ㄥ煎纺锛夌湅涓婂幓镀忎竴涓鍒楄〃銆傚逛簬闆嗗悎鍜屽瓧鍏告樉绀烘潵璇达纴涔熸槸涓镙风殑阆撶悊銆备絾鏄鐢变簬娌℃湁鐢熸垚鍣
瀛楅溃閲忚娉曪纴锲犳ゆ牴链灏辨病链変竴涓鐢熸垚鍣ㄦ樉绀哄彲浠ヨ繘琛屽规瘆锛屼篃灏变笉瀛桦湪鐢熸垚鍣ㄦ樉绀轰简銆
鍦ㄨ捐¤ュ姛鑳界殑闾e皝闾浠朵腑锛屸沧帹瀵煎纺钬濅竴娆℃槸钬沧樉绀衡濈殑钖屼箟璇嶏纴鐢变簬鐢熸垚鍣ㄦ病链夋樉绀猴纴镓浠ヤ篃涓嶅彲鑳芥湁鎺ㄥ煎纺銆
涓嶈繃Time鍦ㄤ粬镄勯偖浠朵腑涔熻村埌锛屾帹瀵煎纺镄勫囧欎箣澶勫湪浜庢浔浠躲傛帹瀵煎叕鐞嗙殑镙稿绩鍒欐槸璋撹銆备篃璁告槸锲犱负Python鎺ㄥ煎纺涓镄勬浔浠舵槸鍙阃夌殑锛屽叧娉ㄧ殑铹︾偣琚杞绉诲埌浜嗘樉绀烘柟闱銆
浣嗘槸鎴戣や负锛屾垜浠搴旇ュ彨瀹冧滑钬灭敓鎴愬櫒鎺ㄥ煎纺钬濄傛垜浠鍦ㄦ弿杩拌繖绫昏娉曟椂锛屽苟娌℃湁浣跨敤钬沧樉绀衡濅竴璇嶃傛垜浠娌℃湁鐞嗙敱灏嗏沧帹瀵煎纺钬濅笌钬沧樉绀衡濆拰瀛楅溃閲忚娉曡仈绯诲湪涓璧枫
鍒楄〃鎺ㄥ煎纺銆佸瓧鍏告帹瀵煎纺銆侀泦钖堟帹瀵煎纺鍜岀敓鎴愬櫒琛ㄨ揪寮忥纴杩椤洓涓琛ㄨ揪寮忓悇镊涔嬮棿链夌潃璁稿氱浉浼间箣澶勚傚傛灉灏嗗洓钥呬箣闂寸殑绫讳技镣规荤粨涓衡沧帹瀵煎纺钬濓纴灏嗘瀬澶у湴绠鍖栫浉鍏虫傚康銆傚畠浠涔嬮棿镄勭浉浼肩偣杩滃ぇ浜庝笉钖屼箣澶勶纴鎴戝缓璁澶у跺硅繖锲涗釜琛ㄨ揪寮忎娇鐢ㄥ悓镙风殑姒傚康
4. 浣滀负绋嫔簭锻樼殑浣狅纴甯哥敤镄勮蒋浠舵湁鍝浜涳纻
杩欎釜灏遍潪甯稿氢简锛屼笅闱㈡垜浠ュ父瑙佺殑缂栫▼寮鍙戣蒋浠鍜屾暟鎹搴撶$悊杞浠朵负渚嬶纴绠鍗曚粙缁嶅嚑绉嶏纴镒熷叴瓒g殑链嫔弸鍙浠ュ皾璇曚竴涓嬶细
01 缂栫▼寮鍙戣蒋浠杩欎釜瑕佺湅鍏蜂綋缂栫▼璇瑷浜嗭纴涓嶅悓璇瑷寮鍙戝伐鍏疯嚜铹朵笉钖岋纴杩欓噷浠ュ父瑙佺殑C/C++銆丣ava鍜孭ython涓轰緥锛岀亩鍗曚粙缁3绉嶆瘆杈冨父鐢ㄧ殑杞浠讹细
杩欐槸Windows骞冲彴涓嬩竴涓闱炲父涓扑笟镄勯泦鎴愬紑鍙戝伐鍏凤纴鍙风О瀹囧畽绗涓IDE鐜澧冿纴涓崭粎浠呭彧鏄疌/C++锛屽父瑙佺殑C#銆乂B绛夌紪绋嬭瑷锛岃繖涓杞浠堕兘鑳藉緢濂芥敮鎸侊纴鏅鸿兘琛ュ叏銆佷唬镰侀珮浜銆佽娉曟镆ョ瓑锷熻兘闱炲父涓嶉敊锛岄櫎姝や箣澶栵纴杩樻敮鎸鍗曞厓娴嬭瘯銆佷唬镰侀吨鏋勫拰鍒嗘瀽绛夐珮绾у姛鑳斤纴锲犳ら潪甯搁傚悎澶у瀷椤圭洰寮鍙戝拰缁存姢锛
杩欐槸涓涓闱炲父涓扑笟鏅鸿兘镄凧ava寮鍙戝伐鍏凤纴鍦ㄤ紒涓氩拰涓浜烘岄溃涓锛屾湁镌闱炲父楂樼殑浣跨敤鐜囧拰娆㈣繋搴︼纴镊锷ㄨˉ鍏ㄣ佽娉曟彁绀恒佷唬镰侀珮浜绛夊姛鑳介潪甯镐笉阌欙纴闄ゆや箣澶栵纴杩樻敮鎸丣Unit銆丆VS鏁村悎銆佷唬镰侀吨鏋勭瓑楂樼骇锷熻兘锛岃嚜甯︽湁Maven鍜孏radle鏋勫缓宸ュ叿锛屽洜姝ゆ洿阃傚悎java椤圭洰寮鍙戝拰缁存姢锛屼釜浜轰娇鐢ㄨ捣𨱒ラ潪甯镐笉阌欙细
杩欐槸涓涓闱炲父涓扑笟镄凯ython寮鍙戣蒋浠讹纴鍜孖ntelliJ IDEA涓镙凤纴Jetbrains鍏鍙哥殑浜у搧锛屽湪涓氱晫闱炲父娴佽屻佸弹娆㈣繋锛屾櫤鑳借ˉ鍏ㄣ佷唬镰侀珮浜銆佽娉曟彁绀虹瓑锷熻兘闱炲父涓嶉敊锛岄櫎姝や箣澶栵纴杩樻敮鎸佷唬镰侀吨鏋勫拰鍒嗘瀽銆佸崟鍏冩祴璇旷瓑楂樼骇锷熻兘锛屽洜姝ゆ洿阃傚悎澶у瀷椤圭洰锛屼釜浜轰娇鐢ㄦ潵璇达纴涔熼潪甯哥亩鍗曪纴寰埚规槗涓婃坠鍜屾帉鎻★细
02 鏁版嵁搴撶$悊杞浠
杩欎釜灏遍潪甯稿氢简锛屼笉钖屾暟鎹搴挞兘链変笓闂ㄧ殑绠$悊杞浠跺拰宸ュ叿锛岃繖閲岀亩鍗曚粙缁3涓姣旇缉阃氱敤镄勬暟鎹搴撶$悊杞浠讹纴鍒嗗埆鏄疕eidisql銆丏Beaver鍜娈ataGrip锛屽逛簬镞ュ父浣跨敤𨱒ヨ达纴闱炲父涓嶉敊锛
杩欐槸Windows骞冲彴涓嬩竴涓闱炲父杞诲阀𨱔垫椿镄勬暟鎹搴撶$悊杞浠讹纴锘轰簬Delphi寮鍙戣屾潵锛岀洰鍓嶆敮鎸丮ySQL銆丮ariaDB銆丮SSQL銆丳ostgreSQL绛変富娴佹暟鎹搴掳纴甯歌佺殑寤哄簱寤鸿〃銆佽嗗浘绱㈠紩銆瑙﹀彂鍣绛夊熀链锷熻兘锛岃繖涓杞浠堕兘鑳藉緢濂藉吋瀹癸纴闄ゆや箣澶栵纴杩樻敮鎸丼QL鑴氭湰瀵煎叆瀵煎嚭銆佹暟鎹澶囦唤鎭㈠岖瓑锷熻兘锛屽逛簬镞ュ父鏁版嵁搴撶$悊𨱒ヨ达纴闱炲父涓嶉敊锛
杩欐槸涓涓锘轰簬Java寮鍙戠殑鏁版嵁搴撶$悊杞浠讹纴鍏嶈垂銆佸紑婧愩佽法骞冲彴锛岀洰鍓嶆敮鎸丱racle銆丮ySQL銆丳ostgreSQL銆丼QL Server绛夊崄鍑犵崭富娴佹暟鎹搴揿紑鍙戯纴寤哄簱寤鸿〃銆佽嗗浘绱㈠紩銆佽Е鍙戝櫒銆瀛桦偍杩囩▼绛夊熀链锷熻兘 閮 鍙杞绘涧镆ョ湅鍜岃捐★纴鏁版嵁搴揿煎叆瀵煎嚭銆佹暟鎹 鎭㈠ 澶囦唤绛夊姛鑳戒篃閮介潪甯镐笉阌欙纴瀵逛簬镞ュ父鏁版嵁搴撶$悊鍜岀淮鎶ゆ潵璇达纴鏄涓涓闱炲父涓嶉敊镄勫伐鍏凤细
杩欎篃鏄涓涓阃氱敤镄勬暟鎹搴撶$悊杞浠讹纴Jetbrains鍏鍙哥殑浜у搧锛屾敮鎸佽法骞冲彴锛屼絾铡熷垯涓婇拡瀵逛釜浜轰笉鍏嶈垂锛屽父瑙佺殑PostgreSQL銆丮ySQL銆丱racle绛夋暟鎹搴掳纴杩欎釜杞浠堕兘鑳藉緢濂芥敮鎸侊纴 鏁版嵁瀵煎叆瀵煎嚭锛 鎭㈠嶅囦唤 锛夈 鏅鸿兘浠g爜濉鍏呫佺増链 闆嗘垚 鎺у埗绛夊姛鑳介潪甯镐笉阌欙纴瀵逛簬镞ュ父鏁版嵁搴撶$悊𨱒ヨ达纴涔熸槸涓涓涓嶉敊镄勫伐鍏凤细
姣忓ぉ甯哥敤寮鍙戝伐鍏凤细
0.Git锛氩垎甯冨纺鐗堟湰鎺у埗绯荤粺锛
1.IntelliJ IDEA锛歫ava璇瑷寮鍙戠殑闆嗘垚鐜澧冿纴IntelliJ鍦ㄤ笟鐣岃鍏璁や负链濂界殑java寮鍙戝伐鍏蜂箣涓锛
2.Sublime Text锛氢笉鍙鏄浠g爜缂栬緫鍣锛
3.Postman锛欻ttp璇锋眰妯℃嫙宸ュ叿鍜屽姛鑳藉己澶х殑缃戦〉璋冭瘯宸ュ叿锛
4.DataGrip锛氭敮鎸佸嚑涔庢墍链変富娴佺殑鍏崇郴鏁版嵁搴銆佸氩姛鑳界殑鏁版嵁搴撴搷浣滃伐鍏凤绂
5.Vagrant锛氱敤浜庡垱寤哄拰閮ㄧ讲铏氭嫙鍖栧紑鍙戠幆澧冿纴閰嶅悎铏氭嫙链浣跨敤锛
6.Gradle锛氲嚜锷ㄥ寲鏋勫缓宸ュ叿锛
7.JIRA锛氶”鐩涓庝簨锷¤窡韪宸ュ叿锛
8.iTerm2锛歁ac涓婄殑缁堢宸ュ叿锛
9.Jenkins锛鎸佺画闆嗘垚宸ュ叿銆
锅氢简涓涓鍐欎唬镰佺敤浜嗗崄鍑犲勾镄勪汉锛屽緢澶氱紪绋嬬殑涔犳傥宸茬粡鍏绘垚浜嗭纴鐜板湪灏辩绥鍒椾笅姣忓ぉ蹇呯敤镄勮蒋浠讹细
鐩存帴瀹夎呯殑linux绯荤粺锛屽洜涓哄嚑涔庢墍链夌殑浠g爜閮芥槸鍦╨inux涓嫔畬鎴
涓嶅悓镄勫紑鍙戣瑷锛屾疮澶╄佺敤鍒扮殑杞浠跺彲鑳戒笉涓镙枫
鎴戞槸寮鍙慾ava web镄勶纴鐢佃剳瀹夎呬简寰埚氩伐鍏凤纴浣嗘槸璇存疮澶╄佺敤鍒扮殑濂藉儚灏卞嚑涓銆
浣滀负绋嫔簭锻树娇鐢ㄦ渶澶氱殑杞浠讹纴銮杩囦簬缂栫▼寮鍙戞墍鐢ㄥ埌镄勮蒋浠剁紪杈戝櫒锛屼絾鏄缂栬緫鍣ㄧ殑绉岖被链夊緢澶氥傛垜浠闇瑕佸仛鍒扮殑鏄锛屾垒鍒颁綘链锽沧㈢殑缂栬緫鍣ㄧ劧钖庣啛缁幂殑浣跨敤瀹冦
钖屾椂鎺屾彙甯歌佺殑涓浜蹇鎹烽敭镄勬搷浣沧柟寮忥纴浠庤屾潵鎻愬崌鎴戜滑镄宸ヤ綔鏁堢巼锛岃屼笉鏄浠ヨ蒋浠惰岃鸿蒋浠讹纴浠涔堥兘铡绘帴瑙︿娇鐢ㄣ傛瘯绔熻蒋浠舵槸宸ュ叿鏄甯锷╂垜浠鎻愬崌寮鍙戞晥鐜囥
涓嬮溃鎴戝氨鍒椾妇鎴戜滑PHP缁忓父浣跨敤镄勮蒋浠
IDE宸ュ叿绫昏蒋浠杩欎竴绫绘槸寮鍙戣蒋浠剁紪鍐欎唬镰佺敤镄勚傝繖涓绫荤殑杞浠堕潪甯稿氾纴鎴戝氨鎺ㄨ崘涓涓缁忓父浣跨敤镄凯HPStorm锛屽洜涓哄お澶氱殑璇濆ぇ瀹朵篃鐢ㄤ笉鍒帮纴涔熸病链夐偅涔埚氱殑绮惧姏铡荤啛缁冩疮涓涓缂栬緫鍣ㄣ
PHPStorm鏄 JetBrains 鍏鍙稿紑鍙戠殑涓娆惧晢涓氱殑 PHP 闆嗘垚寮鍙戝伐鍏凤纴镞ㄥ湪鎻愰珮鐢ㄦ埛鏁堢巼锛屽彲娣卞埢鐞呜В鐢ㄦ埛镄勭紪镰侊纴鎻愪緵鏅鸿兘浠g爜琛ュ叏锛屽揩阃熷艰埅浠ュ强鍗虫椂阌栾妫镆ャ傚彲浠ヨ存槸PHP寮鍙戠▼搴忓憳蹇呭囩殑绁炲櫒銆
甯哥敤蹇鎹烽敭濡备笅锛
1.澶嶅埗蹇鎹锋柟寮
F5 澶嶅埗鏂囦欢/鏂囦欢澶
CTRL+C 澶嶅埗
CTRL+V 绮樿创
CTRL+X 鍓 鍒,鍒犻櫎琛
CTRL+D 澶嶅埗琛
CTRL+SHIFT+V 鍙浠ュ嶅埗澶氢釜鏂囨湰
2.镊锷ㄤ唬镰
ALT+锲炶溅 瀵煎叆鍖,镊锷ㄤ慨姝
CTRL+ALT+L 镙煎纺鍖栦唬
镰丆TRL+ALT+I 镊锷ㄧ缉杩
CTRL+ALT+O 浼桦寲瀵煎叆镄勭被鍜屽寘
CTRL+SHIFT+SPACE 鍒囨崲绐楀彛
CTRL+SPACE绌烘牸 浠g爜镊锷ㄥ畬鎴愶纴浠g爜鎻愮ず,涓鑸涓庤緭鍏ユ硶鍐茬獊
CTRL+ALT+SPACE 绫 钖嶆垨鎺ュ彛钖嶆彁绀猴纸涓庣郴缁熷啿绐侊级
CTRL+P 鏂规硶鍙傛暟鎻愮ず锛屾樉绀洪粯璁ゅ弬鏁
CTRL+J 镊锷ㄤ唬镰佹彁绀猴纴镊锷ㄨˉ鍏
CTRL+ALT+T 鎶婇変腑镄勪唬镰佹斁鍦 TRY{} IF{} ELSE{} 閲孉LT+INSERT 鐢熸垚浠g爜(濡侴ET,SET鏂规硶,鏋勯犲嚱鏁绛)
3.杩愯
Alt + Shift + F10 阃夋嫨镄勯厤缃鍜岃繍琛
Alt + Shift + F9 阃夋嫨閰岖疆鍜岃皟璇
Shift + F10 杩愯
Shift + F9璋冭瘯
Ctrl + Shift + F10杩愯岃寖锲村唴閰岖疆缂栬緫鍣
Ctrl + Shift + X杩愯屽懡浠よ
4.鍏朵粬蹇鎹锋柟寮
CTRL+Z 鍊挜(浠g爜钖庢倲)
CTRL+SHIFT+Z 钖戝墠
CTRL+H 鏄 绀虹被缁撴瀯锲
Ctrl +F12 鏂囦欢缁撴瀯寮瑰嚭
CTRL+O 榄旀湳鏂规硶
CTRL+/ 娉ㄩ喷//鍙栨秷娉ㄩ喷
CTRL+SHIFT+/ 娉ㄩ喷/*...*/
ctrl + '.': 鎶桦彔阃変腑镄勪唬镰佺殑浠g爜
ALT+ / 鍒囨崲浠g爜瑙嗗浘锛屾爣绛惧垏鎹
5.鍏朵粬蹇鎹锋柟寮
CTRL+Z 鍊挜(浠g爜钖庢倲)
CTRL+SHIFT+Z 钖戝墠
CTRL+H 鏄 绀虹被缁撴瀯锲
Ctrl +F12 鏂囦欢缁撴瀯寮瑰嚭
CTRL+O 榄旀湳鏂规硶CTRL+/ 娉ㄩ喷//鍙栨秷娉ㄩ喷
CTRL+SHIFT+/ 娉ㄩ喷/*...*/
ctrl + '.': 鎶桦彔阃変腑镄勪唬镰佺殑浠g爜
ALT+ / 鍒囨崲浠g爜瑙嗗浘锛
鏁版嵁搴撶浉鍏冲父鐢ㄧ殑宸ュ叿 Navicat for MySQL鏄绠$悊鏁版嵁搴撶殑镎崭綔宸ュ叿锛岄兘鏄鍙浠ヨ繛鎺ヨ繙绋嬬殑浜戞暟鎹搴撱傛柟渚跨亩鍖栧紑鍙戯纴杩桦彲浠ユ坠锷ㄥ囦唤銆佸彲瑙嗗寲镄剆ql鍒嗘瀽銆
甯哥敤蹇鎹烽敭锛
ctrl+q 镓揿紑镆ヨ㈢獥鍙
ctrl+/ 娉ㄩ喷sql璇鍙
ctrl+shift +/ 瑙i櫎娉ㄩ喷
ctrl+r 杩愯屾煡璇㈢獥鍙g殑sql璇鍙
ctrl+shift+r 鍙杩愯岄変腑镄剆ql璇鍙
F6 镓揿紑涓涓猰ysql锻戒护琛岀獥鍙
ctrl+d 锛1锛夛细镆ョ湅琛ㄧ粨鏋勮︽儏锛屽寘𨰾绱㈠紩 瑙﹀彂鍣锛屽瓨鍌ㄨ繃绋嬶纴澶栭敭锛屽敮涓阌;锛2锛夛细澶嶅埗涓琛
ctrl+l 鍒犻櫎涓琛
ctrl+n 镓揿紑涓涓鏂扮殑镆ヨ㈢獥鍙
ctrl+w 鍏抽棴涓涓镆ヨ㈢獥鍙
ctrl+tab 澶氱獥鍙e垏鎹
链嶅姟鍣ㄨ繛鎺ヨ蒋浠XShell6鏄闱炲父寮哄ぇ镄凷SH杩灭▼缁堢瀹㈡埛绔锛屽府锷╂垜浠杩炴帴杩灭▼镄凩inux链嶅姟鍣ㄦ潵杩涜屾搷浣溿
绮樿创锛歋hift+Insert
铡嗗彶 锻戒护缂栬緫ctrl + p 杩斿洖涓娄竴娆¤緭鍏ュ懡浠ゅ瓧绗
alt + > 杩斿洖涓娄竴娆℃墽琛屽懡浠
鍏跺畠
ctrl + s 阌佷綇缁堢
ctrl + q 瑙i挛缁堢
ctrl + l 娓呭睆鐩稿綋浜庡懡浠clear
Tab阌锛屽揩阃熻ˉ鍏ㄥ懡浠
杞婚噺绾ф枃链缂栬緫鍣Notepad++銆傝繖涓寰堣交閲忥纴镓揿紑涓涓嬫枃链闱炲父镄勬柟渚裤
甯哥敤蹇鎹烽敭
Ctrl+C 澶嶅埗
Ctrl+X 鍓鍒
Ctrl+V 绮樿创
Ctrl+Z 鎾ゆ秷
Ctrl+Y 鎭㈠
Ctrl+A 鍏ㄩ
Ctrl+F 阌镆ユ垒瀵硅瘽妗嗗惎锷
Ctrl+H 镆ユ垒/镟挎崲瀵硅瘽妗
Ctrl+D 澶嶅埗骞剁矘璐村綋琛
Ctrl+F2 鍒囨崲涔︾
F2 杞鍒颁笅涓涓涔︾维hift+F2 杞鍒颁笂涓涓涔︾
F11 鍏ㄥ睆妯″纺
鍓岖 锛
visual studio code
钖庣锛
pycharm
IDEA
瀹夊崜锛
android studio
娴忚埚櫒锛
璋锋瓕
𨱔镫
鏁版嵁搴撶$悊锛
navicat
杩灭阈炬帴锛
fileZilla
xshell
electerm锛坢ac涓娄娇鐢锛
娴佺▼锲捐捐★细
xmind
processOn
绗旇帮细
涓虹煡绗旇帮纸浠樿垂涓骞60锛
链夐亾浜戠玛璁
铏氭嫙链猴纸瀹瑰櫒锛
VMware Fusion锛坢ac涓婏级
docker
鍏朵粬锛
postman
jmeter
浣滀负涓涓12骞村紑鍙戠粡楠岀殑鍓岖绋嫔簭锻桡纴鎴戞潵镵婅亰姣忓ぉ蹇呯敤镄勫嚑涓杞浠躲
鍐欎唬镰佽嚜铹剁讳笉寮 缂栬緫鍣 銆傜洰鍓嶆垜涓昏佷娇鐢ㄧ殑鏄寰杞镄 Visual Studio Code 銆俈S Code姣旇缉杞婚噺锛屽姛鑳借冻澶熷簲浠樻棩甯稿紑鍙戞墍闇锛岃法骞冲彴锛岃屼笖瀹屽叏鍏嶈垂 銆傚洜涓轰箣鍓嶉暱链熶娇鐢╒isual Studio鍦╓indows骞冲彴涓婂仛寮鍙戯纴钖庢潵鎶链镙埚彉鍖栵纴缁忓父闇瑕佸湪Linux鍜孧acOS涓婂仛寮鍙戯纴VS Code灏辨垚浜嗘垜椤虹悊鎴愮珷镄勯夋嫨銆傚悗𨱒ュ共鑴嗗湪Windows涓娄篃鐢╒S Code浜嗐傜洰鍓嶆暣涓锲㈤槦閮藉凡缁忚玍S Code鍦堢矇浜嗐傚叾瀹幂被浼肩殑濡係ublime Text(闇瑕佷粯璐)鍜孉tom涔熸湁涓嶅皯浜轰娇鐢ㄣ
锲犱负鏄锲㈤槦寮鍙戯纴 婧愪唬镰佺$悊宸ュ叿 镊铹跺繀涓嶅彲灏戯纴钥 git 鏄鐩鍓嶆渶鐑闂ㄧ殑涓涓銆傛垜浠鍏鍙镐篃涓崭緥澶栵纴鍑犲勾鍓崭粠Perforce杩佺Щ鍒颁简 GitHub浼佷笟鐗 (鍜屽叕浼楃増链琔I瀹屽叏鐩稿悓)銆傚钩镞剁殑浠g爜瀹℃煡涔熼兘鏄鍦℅itHub浼佷笟鐗堜笂瀹屾垚镄勶纴涓嶅啀浣跨敤鍗旷嫭镄勪唬镰佸℃煡宸ュ叿銆傛湁浜涗笉涔犳傥浣跨敤锻戒护琛屾柟寮忕殑钖屼簨浣跨敤 SourceTree 瀹屾垚镞ュ父镄勪唬镰佸垎鏀绠$悊鍜屾彁浜わ纴钥屾垜鍒欐瘆杈幂儹琛蜂簬锻戒护琛屾柟寮忋俈S Code涔熸彁渚涗简姣旇缉瀹屽杽镄刧it闆嗘垚锛屼絾锲犱负涔犳傥镄勫师锲狅纴闄や简鐩磋傛瘆杈冧笉钖屼唬镰佺増链镄勫樊寮傦纴鎴戜竴鑸涔熶笉鐢╒S Code镓ц実it镎崭綔銆
浣滀负涓涓猈eb鍓岖锛 娴忚埚櫒鍙婂墠绔璋冭瘯宸ュ叿 镊铹朵笉鍙鎴栫己锛 Google Chrome + Developer Tools (F12) 镊铹舵槸棣栭夈备娇鐢―eveloper Tools锛屽彲浠ュ笿avaScript杩涜岃皟璇曪纴鐩戞带HTTP璇锋眰/鍝嶅簲锛屽垎鏋怌SS璁$畻闂棰桦拰JS镐ц兘闂棰樸 Chrome涓嬭缮链夊緢澶氩姛鑳藉己澶х殑鎻掍欢锛屼釜浜烘瘆杈冨父鐢ㄧ殑鍖呮嫭React Developer Tools銆丳ostMan銆丳roxy SwitchOmega鍜孉dBlock銆傚綋铹讹纴锲犱负缁忓父闱㈠规祻瑙埚櫒鍏煎规ч梾棰桡纴Firefox銆両E銆丒dge銆丄pple Safari浠ュ强钖勮嚜镄凞eveloper Tools閮芥槸鍏崭笉浜呜佺敤镄勚
锲㈤槦鐩鍓崭娇鐢⊿crum妯″瀷锛岃嚜铹堕渶瑕佷竴涓锅 浠诲姟瑙勫垝鍜岃川閲忕$悊 镄勫伐鍏枫傛垜浠閲囩敤浜 JIRA , 姣忓ぉ镄勭珯浼(daily stanp meeting)閮戒细瀵箂crum鐪嬫澘(board)杩涜屾洿鏂般
阆囧埌鎶链闂棰桡纴镊铹跺厤涓崭简瑕佷笂缃戞煡镓捐祫鏂欍 Google 镄勪娇鐢ㄩ戠巼闱炲父楂(闇瑕佺戝︿笂缃)銆傚ぇ閮ㄥ垎闂棰橀兘鑳藉湪 StackOveflow 涓婃垒鍒扮嚎绱锛屼絾链夋椂鍊欎篃涓嶅缑涓嶈窇鍒板ぇ钖嶉紟榧庣殑钖屾т氦鍙嬬绣绔 GitHub 涓婄湅婧愮爜銆 MDN 锛圡ozilla Developer Network锛夊逛簬鍓岖寮鍙戜篃鏄涓嶅彲鎴栫己(姝ゅ勯剻瑙嗕竴涓媤3cschool锛屼笂闱㈠埌澶勬槸阌栾鐭ヨ瘑)銆
鍏跺畠濡俷ode.js/npm銆乨ocker绛夛纴锲犱负鍜屽叿浣撶殑鎶链镙堢浉鍏筹纴灏变笉鍏蜂綋灞曞紑璁蹭简銆
浣滀负涓涓寮鍙戜汉锻桡纴浣犳疮澶╀娇鐢ㄤ粈涔堣蒋浠跺憿锛屾㈣繋璇磋寸湅銆
灏界℃垜鏄钖庣鍑鸿韩镄勶纴涓嶈繃涔熺粡甯稿啓鍓岖浠g爜锛岀敋镊宠缮鐢–#/C++鍙备笌杩囦竴浜涘㈡埛绔寮鍙戯纴镊璁や负涔熺畻鏄涓涓猈eb鍏ㄦ爤宸ョ▼甯堛傞殢镌鍓岖鎶链镄勪笉鏂杩涙ワ纴鐜板湪镄勫墠绔宸茬粡涓嶅啀鏄鍐椤啓椤甸溃杩欎箞绠鍗曚简锛屽緢澶氶昏緫鍦ㄥ墠绔灏卞啓浜嗭纴鎴戝缓璁姣忎竴涓鍑鸿壊镄勫紑鍙戣呭簲璇ュ敖鍙鑳藉瑰墠钖庣閮借兘链変笉阌欑殑鎺屾彙銆
浠婂ぉ缁椤ぇ瀹舵帹钻愪竴浜涙垜璁や负鍓岖鍜屽悗绔寮鍙戦兘闇瑕佺粡甯哥敤鍒扮殑涓浜涜蒋浠讹纴杩欓噷闱㈠寘𨰾浜嗘煡璇㈣祫鏂椤伐鍏枫佸师鍨嫔伐鍏枫佹枃链缂栬緫鍣ㄣ佺増链绠$悊宸ュ叿銆
铡熷瀷宸ュ叿 涓岖″墠绔杩樻槸钖庣锛屽挨鍏舵槸鍓岖绋嫔簭锻桡纴鍦ㄨ窡浜у搧缁忓巻娌熼氢箣钖庤偗瀹氢细瑕佹煡鐪嫔师鍨嬬殑锛屾柟渚胯嚜宸卞湪寮鍙戣繃绋嬩腑浣跨敤锛屽熀链涓婂ぇ鍏鍙歌緭鍑虹殑铡熷瀷閮芥瘆杈冭勮寖锛岄櫎闱炰綘阆囧埌寮犲皬榫栾繖绉岖骇鍒镄勫ぇ绁烇纴鍝ヤ滑鍎跨洿鎺ョ洴镌浣犲仛浜嗐
鐩鍓崭富娴佺殑铡熷瀷宸ュ叿涓昏佹湁Axure銆丮ockPlus銆佸ⅷ鍒绛夛纴鍏朵腑Axure渚濈劧鏄搴旂敤链涓哄箍娉涚殑铡熷瀷宸ュ叿锛屽ぇ澶氭暟寮鍙戣呬篃閮藉簲璇ョ敤𨱒ョ湅铡熷瀷銆
鏂囨湰缂栬緫鍣 涓岖℃槸鍓岖杩樻槸钖庣绋嫔簭锻桡纴褰撶劧鍓岖绋嫔簭锻桦氨涓嶈翠简锛屽湪WebStorm鍑虹幇涔嫔墠锛屾病链変竴娆剧湡姝e彲浠ュ彨锅欼DE镄勫墠绔寮鍙戝伐鍏凤纴闾d箞锘烘湰涓婃枃链缂栬緫鍣ㄥ氨鏄鍓岖绋嫔簭锻樻渶閲嶈佺殑缂栫▼宸ュ叿銆傚悓镙峰悗绔绋嫔簭锻桦嵆浣夸笉闇瑕佸啓鍓岖浠g爜锛屾枃链缂栬緫鍣ㄤ篃鏄蹇呭囩殑锛屾偍涓嶉渶瑕佹疮娆$湅浠g爜閮芥墦寮搴炲ぇ镄勯泦鎴愬紑鍙戠幆澧冿纴镀廔DEA杩欑嶆瘆杈冭楄垂璧勬簮镄勶纴骞虫椂镆ョ湅浠g爜鍟ョ殑瀹屽叏娌℃湁蹇呰侊纴浣曞喌浣犺缮缁忓父瑕佺湅涓浜涘墠绔浠g爜銆
褰撶劧浣犳瘆杈冧範𨱍疞inux/Unix涓嫔紑鍙戯纴Emacs/Vim鍙鑳芥槸浣犵敤寰楁瘆杈冨氱殑鏂囨湰缂栬緫鍣锛岃缮链塙ltraEdit銆丼ublime Text銆丒ditPlus銆丄tom杩欎簺钥佺墝镄勬枃链缂栬緫鍣锛屼笉杩囩幇鍦ㄦ垜瑙夊缑姣忎釜绋嫔簭锻橀兘搴旇ヤ笅杞戒竴涓猇isual Studio Code锛屾敮鎸佺殑璇瑷姣旇缉澶氾纴钥屼笖鎻掍欢闱炲父涓板瘜锛屾槸寰杞瀹樻柟鏀鎸佺殑寮鍙戣呭伐鍏凤纴寮婧愬厤璐硅屼笖棰滃奸潪甯搁珮銆
镆ヨ㈣祫鏂欍佺増链绠$悊宸ュ叿涓岖敤澶氲达纴姣忎釜绋嫔簭锻橀兘瑕佸︿细寰埚ソ镄勪娇鐢℅oogle銆丼tack Overflow涓や釜宸ュ叿锛屽彲浠ヨ翠綘镞ュ父寮鍙戝綋涓鍙鑳介亣鍒扮殑闂棰桡纴阃氲繃杩欎袱涓宸ュ叿浣犲叏閮借兘镓惧埌瑙e喅鏂规堛
鍙﹀栦竴涓鏄疍ash鏂囨。绠$悊宸ュ叿锛娈ash鏄涓涓闱炲父濂界殑寮鍙戣呭府锷╂枃妗e伐鍏凤纴杩欎釜宸ュ叿镄勫ソ澶勬槸缁欐墍链夌殑寮鍙戞枃妗e仛浜嗕竴涓鏁村悎锛孋/C++銆丣ava銆丳HP銆丳ython銆丩atex銆丒macs Lisp銆丠askell銆丣avaScript銆丢o璇瑷绛夋枃妗i兘鑳藉熷湪杩欎釜宸ュ叿褰扑腑涓嬭浇浣跨敤銆
链钖庝竴涓灏辨槸鐗堟湰绠$悊浜嗭纴SVN鍜孏it渚濈劧鏄鐩鍓崭娇鐢ㄦ渶涓哄箍娉涚殑鐗堟湰绠$悊宸ュ叿锛屼笉杩囧氨浣跨敤𨱒ヨ存垜杩樻槸鎺ㄨ崘Git鐗堟湰鎺у埗绯荤粺锛屽彲浠ヨ磋繖涓镞朵唬Git灏辨槸链濂界殑鐗堟湰绠$悊宸ュ叿浜嗭纴灏ゅ叾鏄寮婧愭椂浠c佷簰镵旂绣镞朵唬锛孏it宸茬粡鎴愪负浜嗘渶閲嶈佺殑鐗堟湰绠$悊宸ュ叿锛屼笉绠℃槸锻戒护琛岀$悊杩樻槸浣跨敤Github绛夊㈡埛绔宸ュ叿锛屽牚绉板畬缇庛
鍏ヨ屽崄涓骞达纴鐜板湪涓昏佸仛涓浜涚$悊鍜屾灦鏋勬柟闱㈢殑宸ヤ綔锛屼篃浼氩仛涓浜汣oding锛屼富瑕佹槸涓浜涙柊鎶链镄勭爷绌跺拰钬滆俯鍧戋濄
缂栬緫鍣棣栧厛鏄疎ditPlus锛岃繖鏄涓涓鏂囨湰缂栬緫鍣ㄣ傛渶甯哥敤镄勪袱涓锷熻兘锛氭e垯琛ㄨ揪寮忔煡璇㈠拰鏂囦欢澶瑰唴镓链夋枃浠跺唴瀹规悳绱銆
骞虫椂缁忓父闇瑕佺湅涓浜涚郴缁熸棩蹇楋纴鐢氲呖瑕佷粠濂藉嚑澶╁嚑鍗佷釜镞ュ织鏂囦欢涓镓惧埌鍐呭癸纴杩欎釜杞浠跺緢濂界敤銆傦纸铡熻皡鎴戜滑娌℃湁涓婃棩蹇楀钩鍙帮级
铹跺悗灏辨槸IDE鍟︼纴鎴戣缮鏄锽沧㈢敤Eclipse锛屾湁镞跺欎细鐢⊿TS(Spring Tool Suite)锛屽畠涔熸槸涓涓琚鍖呰呰繃镄凟clipse锛屾柟渚垮仛涓浜汼pring妗嗘灦镄勭爷绌躲
涓涓鏄疍bVisualizer锛屽嚒鏄鍏锋湁JDBC鏁版嵁搴撴帴鍙g殑鏁版嵁搴挞兘鍙浠ョ$悊锛屼粈涔堟暟鎹搴挞兘鑳借繛銆
杩樻湁涓涓鏄疭QLyog锛岃繖鏄涓涓蹇阃熻岀亩娲佺殑锲惧舰鍖栫$悊MYSQL鏁版嵁搴撶殑宸ュ叿锛屾垜鍙鐢ㄩ噷闱涓涓锷熻兘锛屽氨鏄鏁版嵁镄勫煎叆瀵煎嚭锛屾晥鐜囬潪甯搁珮锛
澶ч儴鍒嗛”鐩鍙瀵瑰栨彁渚涙帴鍙f湇锷★纴镓浠ユ帴鍙f祴璇曞伐鍏峰皯涓崭简锛屾垜涓鑸浣跨敤SoapUI锛学ebService/Rest閮藉彲浠ヨ繘琛屾祴璇曘
姣忓ぉ镶瀹氢细鐢ㄧ殑镶瀹氢笉姝涓婇溃鍑犱釜锛岃缮链夌増链鎺у埗宸ュ叿svn鍜実it锛岄兘浼氱敤鍒版槸锲犱负鍗曚綅svn鐜板湪寮濮嫔线git杩佺Щ銆
锲犱负鐢ㄧ殑Scrum鏁忔嵎寮鍙戞祦绋嬶纴镓浠JIRA銆丼onar銆丗isheye杩欎簺涔熸槸閮戒细鐢ㄥ埌镄勚
Maven涔熶笉鐢ㄨ翠简锛屽嚑涓椤圭洰锘烘湰閮芥槸锘轰簬Maven鏋勫缓镄勚
蹇呯敤镄勫熀链灏辨槸杩欎簺锛屽彧瑕佺数鑴戝紑镌锛岃繖鍑犱釜杞浠跺熀链閮芥槸镓揿紑鐘舵併