整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          大四學生發明文言文編程語言,腦洞新奇

          理 | 夕顏

          出品 | AI科技大本營(ID:rgznai100)

          【導讀】近日,GitHub 上一個叫做文言文(wenyan)的編程語言項目火了,就在本文成文期間,GitHub 上的 Star 數已經從 2200 漲到 2800,并還有繼續上漲的趨勢。只需要在在線編輯器上,或下載一個編譯器,就可以用文言文進行編程。讓人驚訝的是,這個涉及思路清奇的項目竟然出自卡內基梅隆大學的一名大四學生之手,不禁讓人感嘆后生可畏。

          文言文(wenyan)是一種深奧的編程語言,遵循中國古典文學的語法和文風。據介紹,這種編程語言文字僅包含繁體中文字符和“''引號,因此古代中國人絕對看得懂。是不是覺得很新奇?那不妨動動你的小手嘗試一下吧,可以在在線編輯器上試用,也可以下載編譯器或查看源代碼。

          在線編輯器:http://wenyan-lang.lingdong.works/ide.html

          下載編譯器:https://github.com/LingDong-/wenyan-lang#installation

          開源代碼:https://github.com/LingDong-/wenyan-lang

          這個項目受到了大家很多好評,有人說項目的設計思路奇特,有人表示在學編程的同時還順帶學習了文言文,一箭雙雕。

          那么,wenyan 究竟是怎么玩的?我們來跟著 GitHub 學習一下。

          語法

          正如如名,文言文(wenyan)遵循古文言文的語法:

          編輯

          wenyan 目前可編譯為 JavaScript 或 Python,將來可能會支持更多語言(比如 C)。上面的“ Hello World”示例(或任何編輯)將轉換為:

          var n = 3;
          for (var i = 0; i < n; i++) {
          console.log("問天地好在");
          }

          輸出結果:

          問天地好在
          問天地好在
          問天地好在

          標點和換行符是完全可選的(就像古文言文一樣),因此上面的代碼等效于:

          吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云

          上面的代碼是可編輯的,你可以自定義問候語并點擊??!

          另一個稍微復雜一點的示例,使用埃及篩查找素數:

          注:埃拉托斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉托斯特尼所提出的一種簡單檢定素數的算法。要得到自然數n以內的全部素數,必須把不大于根號n的所有素數的倍數剔除,剩下的就是素數。來源 | 百度百科

          你可以在在線 IDE 上找到更多示例,例如通用圖靈機、曼德勃羅分形圖、漢諾塔等。

          特征

          • NLP遵循古文言文語法

          • 編譯為JavaScript或Python

          • 圖靈完備(https://github.com/LingDong-/wenyan-lang/blob/master/examples/turing.wy 在可計算性理論里,如果一系列操作數據的規則(如指令集、編程語言、細胞自動機)可以用來模擬單帶圖靈機,那么它是圖靈完備的。)

          • 在線IDE http://wenyan-lang.lingdong.works/ide.html

          • 入門示例 https://github.com/LingDong-/wenyan-lang/tree/master/examples

          安裝

          編譯器

          克隆存儲庫(或下載 ./build/wenyan.js 并設置其可執行位 chmod +x wenyan.js)。然后運行 ./build/wenyan.js,把你的 wenyan 源代碼編譯為目標語言。調用不帶參數的編譯器將顯示幫助消息,如下所示:

          Usage: wenyan [options] [input files]

          Options:
          --eval -e <string> : Give a string instead of a file (default: `')
          --exec -x <boolean> : Execute ouput (default: `false')
          --inspect -i <boolean> : Interactive REPL (default: `false')
          --lang -l <string> : Language: js/py (default: `js')
          --log <string> : Log file (default: `/dev/')
          --output -o <string> : Output file (default: `/dev/stdout')
          --roman -r <boolean> : Romanize identifiers (default: `true')

          首先嘗試構建包含的示例,例如:

          ./build/wenyan.js examples/helloworld.wy -o helloworld.js

          構建平臺特定的二進制文件

          • 克隆倉庫

          • npm install

          • npm run make_cmdline

          macOS、Windows和Linux二進制文件將位于./build文件夾中。

          語法備忘單

          該項目團隊正在加緊構建與上下文無關的語法描述。同時,你還可以查看以下備忘單或src/parser.js 了解該項目語法。

          變量 管理 數學

          容器

          數組是1索引的。

          特征

          渲染器

          src / render.js 可以將 wenyan 程序渲染為有歷史感的印刷書籍頁面圖像。它還可以將生成的SVG 文件解析回原始程序。下面是用 wenyan 編寫的通用圖靈機的渲染圖:

          出自CMU大四學生之手

          值得注意的是,這個思路清奇的設計竟然出自一名卡內基梅隆大學的大四學生 Ling Dong Huang。

          在作者簡介中,Ling Dong Huang 表示自己將于 2020 年獲得計算機科學學位,此前,他曾在迪士尼研究院、 Antimodular 研究院和《紐約時報》實習,自己也做了項目網站 https://lingdong.works/。目前已經有將近 30 個項目。項目主題豐富多彩,比如用 emoji 做成的小游戲,使用用戶提交的涂鴉做成的計算機動畫,以及和本文一樣對中國下手,把中國表意文字和部首做成可視化動畫,等等,并給出了項目的源代碼。

          此外,他的項目還包括:

          • 隱士——互動式程序生成景觀(CMU 2015 年秋季 CS 15-112 學期項目競賽優勝者)

            https://github.com/LingDong-/Hermit

          • 普通人臉模擬器——本地2人人臉模擬。(觀看次數 180 + K,在 itch.io 上下載 60 + K)

            https://lingdonh.itch.io/normal-human-face-simulator

          • {山,水} **——程序無限生成的中國山水畫。(2018 年 5 月在卡耐基梅隆大學展出)

            https://github.com/LingDong-/shan-shui-inf

          • 錯山記(Legend of Wrong Mountain)——一部完全由機器使用程序生成和機器學習技術編寫、創作和表演的中國戲曲。(論文已被 2 0 1 8 NIPS workshop 接收)

            https://www.youtube.com/watch?v = QPdb28h4qjc我的在線投資組合中的更多項目(https://lingdong.works)

          不得不說,作者的腦洞不小,不少項目的創意很是新奇。

          這個項目你覺得怎么樣?如果你發現了更多好玩有趣的項目,歡迎留言和我們分享。

          【End】

          ,參與報名!

          者 | 編程指北

          出品 | 編程指北(ID:cs_dev)

          頭圖 | CSDN 下載自視覺中國

          前言

          為什么突然想寫這個話題呢?

          最近有不少新關注的讀者,在后臺問:大學學 Java 和 C++ 哪個好找工作,學前端好還是后端好,該學 Vue 還是 React。。。

          仿佛看到了自己當年的模樣,所以覺得有必要單獨寫一篇文章,單純以一個計算機應屆畢業生的身份聊聊,我認為大學四年,計算機科班學生應該學些什么,哪些才是重點。

          同樣大學四年,為什么有些同學畢業就能成為大廠 Offer 收割機,各種 SP、SSP 拿到手軟,有的同學明明在學校寫了好多網站,項目經歷滿滿,經歷春秋招,卻找到一份工作都很難。

          不能說后者沒認真學習,或許是用力的方向不對。

          話不多說,直接進正題吧。

          正文

          人類的知識邊界一直在不斷的擴張,俗話說學無止境,這放在計算機領域也同樣適用,計算機本身是一個人造科學,不屬于自然科學。

          每年,甚至每個月都不斷有新的編程框架推出,學到頭禿你也學不完,也沒有必要去挨個學。

          并且你會發現,很多一二線大廠內部用的東西基本都是自己搞一套的,比如服務發現、RPC、KV、DB、消息隊列、日志、監控等等。

          所以一般這些大廠招聘的時候基本不會因沒學過某種框架而掛你,反正很多東西都是要進來重新學的。

          他們會更加關注你的基礎知識、解決問題的經驗以及聰明度這種更加通用的能力上。

          反而是一些小公司,可能會要求你必須會 Spring、Vue、Redis... 這些框架或者組件。

          騰訊JD

          阿里JD

          某家外包JD

          上面分別是騰訊、阿里、某外包公司的招聘 JD(job description),顯然,騰訊阿里看中的是扎實的編程基本功和快速學習能力,這意味著有培養潛力。

          而外包公司就要求你會 xx 數據庫、Spring 之類。不去評價哪個好,但是如果你想去 BAT,那是不是至少對照著它們的 JD 來提高自己的能力,不失為一種捷徑。

          在這里,我粗淺的把計算機編程領域的知識分為三個部分:

          • 基礎知識

          • 特定領域知識

          • 框架和開發技能

          基礎知識是指不管從事任何方向的軟件工程師都應該掌握的,比如數據結構、算法、操作系統。

          特定領域知識就是你從事某個細分方向時需要掌握的知識,比如做游戲引擎的需要掌握圖形學;做前端的需要掌握瀏覽器渲染原理、前端三大件;算法工程師需要更多的數學知識。

          畢竟計算機各種門類挺多的,需要選個細分方向專研下去,什么都學只會什么都不精(大佬除外啦。

          基礎知識

          現在大環境比較浮躁,很少有人愿意花心思在基礎上,喜歡直接學 Python 搞機器學習、寫秒殺、做商城。

          找工作的時候都是想看面經、總結速成。

          但是作為優秀的計算機系學生的你怎么能流于各種編程框架(造框架除外),糾結學 SpringBoot 還是 SSH 呢?

          把時間花在算法、基礎學科上他不香嗎?功利一點講,回報反而會更大。

          況且在計算機領域,很多基礎的理論并不十分高深,我們努努力就可以掌握其中的核心知識。

          1、數學

          首先說明,這里把數學列出來不是為了顯得高端,而是自己吃過數學的虧。

          如果你是自學轉行當程序員,我當然不會推薦數學,因為轉行的大概率是去學 Java、前端這類,對數學基本沒啥要求。

          但是這篇文章主要面向的是還在大學的科班學生,這部分同學以后也許會去做算法(CV、NLP之類)、游戲引擎、信息安全編碼等

          這些方向對數學要求就會偏高,在計算機領域,線代、概率論、統計學這些數學分支相對比較重要,計算機本質上還是離散的。

          比如在機器學習或數據挖掘中常常用線性代數來降低數據維度,很多問題最終都能化為求解線性方程組。

          所以為了避免以后想走這些方向卻被數學卡住,在大一、大二上數學課的時候就好好的學一下。

          書到用時方恨少,不要現在以為沒用處就不好好學,等你需要的時候,就知道后悔了。(默默流下了不學無術的眼淚┭┮﹏┭┮

          什么?你說以后肯定做開發方向?

          那的確可以把數學優先級放后面一點,用得確實不多,不過上數學課的時候總該認真聽下吧,拿個高績點也是百利無一害嘛。說不準哪天你又想加入算法內卷大軍呢?

          2、C語言

          你也許會很疑惑,這里明明說基礎知識,為什么要把一門編程語言單獨列出來呢?

          因為在我看來,沒有比 C 語言更適合用來理解計算機系統了。

          我們后面將會提到的操作系統、體系結構 這些東西非常適合用 C 語言去理解或者去實踐。

          并且 C 語言本身的語言特性非常少,但是想學好又是不容易,很多人都覺得 C 語言難,難在哪里呢?回想了一下我大一時的感受:

          • 簡陋的標準庫,幾乎沒有可用的數據結構和算法,什么都得自己來

          • 指針很難理解和使用

          • 需要了解匯編、鏈接、裝載、內存等才能把 C 語言用好

          不巧的是,這些東西正是計算機系統知識的一部分,所以用 C 語言作為學習計算機系統知識是最有效率的方式。

          真的很難想象用 Java 或是 Python 去給別人講解內存,因為這些語言抽象程度都比 C 語言高,意味著離計算機系統也就越遠。

          在 TIOBE 編程語言排行榜上,C語言幾乎永遠占據前三位,其地位自然毋庸置疑。

          TIOBE-2020排行榜

          而且幾乎你開發中用到的很多東西都是用C語言編寫的,Linux、Nginx、Redis、MySQL、Git......或許你會想要探究下原理,閱讀點這些開源軟件的源碼,那么 C 語言也是你必備的瑞士軍刀。

          深入學習 C 語言,能夠了解計算機底層的執行原理,是理解程序運行機制的絕佳語言,無出其右。

          在這里,不得不引用對C語言最經典的總結:

          任何比C語言更低級的語言,都不足以完整地抽象一個計算機系統;任何比C高級的語言,都可以用C來實現。

          這真是極高而中肯的評價!

          所以對于計算機科班來說,不管你是做前端還是后端,算法還是開發,C 語言都建議你好好學習。這是無關方向的一門語言,就是基礎!

          3、操作系統

          我們編程的 IDE、寫出來的程序全部都需要運行在操作系統上,說操作系統是計算機軟件的基石也不為過。

          程序運行起來就需要創建進程,這涉及到操作系統的進程管理;寫程序需要定義變量、存儲數據吧,這又涉及到內存,對應內存管理;有時候我們還需要讀寫文件,這又離不開和文件系統打交道;你需要學習使用鎖、條件變量、臨界區來保證程序并發執行時不會錯亂。

          而讀寫文件、分配內存這些又離不開系統調用(System call)。

          并且當你真正做起工程就會發現,很多問題是和操作系統緊密相關的,不理解操作系統,你連問題的原因都分析不出來。

          比如前段時間我們出現的在基于協程(libco)的框架下,使用多線程的鎖去做同步互斥偶發死鎖,后來分析才發現原因:

          由于協程是應用層實現的,一個線程內多個協程對于操作系統是感知不到的:

          協程模型

          那么當一個協稱 A 上鎖后發起網絡 IO 請求,這個時候會被切換到另外一個協程B,而協程 B 又去請求這個鎖。

          那么這個時候操作系統會認為這個鎖已經被上了,因此會將協程 B 對應的線程掛起到等待隊列,這樣的話就導致協程 A 永遠無法運行,也就無法釋放鎖,導致死鎖。

          解決的方法也很簡單,就是將鎖設置為可重入鎖,可重入意味著同一個線程多次去請求同一個鎖不會導致掛起。這樣當協程 B 再去請求鎖的時候,操作系統就會認為協程 B 所在的線程已經持有這個鎖了,直接返回,繼續執行。

          總之,我們寫程序每時每刻都在和操作系統交互,沒有理由不學好。

          4、編譯原理

          編譯原理可能是我們平時接觸得最少的了,大家也許會覺得自己又不用去造新的編程語言,學編譯原理干啥。

          學好編譯原理有啥用?

          你會站在更高的角度去審視這些編程語言,看到的不再是表面的語法,更會想到語法背后的實現。

          這種感覺很透徹,就像搞懂了操作系統、體系結構你會明白一個程序從雙擊鼠標開始,到底是如何被運行起來的,這種掌握一切細節,透徹的感覺,真的很奇妙,不信你去試試。

          說人話!

          那學了編譯原理你能干啥?

          當你學完有限狀態機以后,你會發現以前覺得很牛逼正則表達式似乎自己也能用 DFA、NFA 實現一下了。狀態機的思想在編程中很多地方都用得上。

          比如解析 HTTP 協議,如果沒學過狀態機思想,你可能會一行行的 if/else 去做解析,這里最麻煩的地方在于,if/else 需要提前將 HTTP 頭部字段都接收到再來判斷,而我們知道 HTTP 基于 TCP,而 TCP 是流式傳輸,所以你很有可能是幾個字符一組組接收到的,這個時候用 if/else 寫出來就很難看了。

          而用狀態機編寫起來代碼就會非常優雅。狀態的轉移是由規則驅動的,接收到一個字符就判斷一個,非常的方便。

          繼續學完語法分析,你會掌握遞歸下降分析這樣非常重要的思想,你可以使用遞歸下降快速的實現四則運算計算器。

          如果不用遞歸下降你可能需要先中綴表達式轉后綴,然后求值,這是我們大一數據結構課寫的,當時用棧寫的,有點麻煩。后來學完編譯原理,又用遞歸下降重寫了一遍,區區幾十行代碼遍搞定。

          還有一類場景在實際開發中的用的很多,比如淘寶、京東這樣的電商,它們的營銷規則有很多,比如滿減、直減、跨店等等,這樣的規則是不可能寫死在代碼里的。

          那是怎么做的呢?

          一般會實現一個配置系統,并設計一個DSL(領域特定語言)來表達這些規則,將規則直接配置到系統中,這樣可以非常方便的修改,那么如何在代碼里去解析 DSL 定義的規則呢?這就需要為 DSL 寫一個語法解析器,這里就會用到語法分析的方法。

          DSL(Domain Specific Language),是一種用于某個特定領域的程序設計語言。這種特定于某個領域是相對于 C、C++、Python 這種通用語言而言的,通用語言可以在各個領域使用,我們熟悉的大多數程序設計語言都是通用語言,它們都是圖靈完備的。

          像我們平常經常使用的 JSON、SQL、HTML 這些都算是一種 DSL,你甚至可以嘗試用遞歸下降去寫一個 JSON、XML 解析器,這比寫電商網站更有價值的。

          繼續往下學你會了解到抽象語法樹 AST 如何生成、如何轉化為中間代碼、如何對中間代碼優化、最終又是怎么生成機器指令的。

          你會看到貪心算法在寄存器分配中的應用,也會看到圖論中的可達性分析又是如何實現死代碼消除。

          IDE上面那個綠色的編譯按鈕對你不再是黑魔法。

          為啥點一下就能生成可執行的程序?

          你寫的英文字母又是如何變成一個個二進制指令的?

          學完編譯原理,這些通通不是問題,媽媽再也不用擔心你的學習~

          當然完成一個像 GCC、Clang 這樣的編譯器難度太高太高,我們學習編譯原理的目的也不是去造這樣的輪子,而是為了更好的理解和運用編程語言。

          5、體系結構&組成原理

          上面說的都是軟件層面,體系結構則是關于計算機是如何工作的,你會了解到典型的存儲程序計算機是怎樣運轉的。

          記得南大有個老師說過 “我們不是學習使用計算機的,而是學習如何造計算機”,雖然造計算機有點夸張,但是至少我們得了解下計算機的實現原理,了解下代碼是怎么被 CPU 執行的吧?不然其實你會很困惑,明明一堆英文字母,怎么在 CPU 這種電路上跑起來的,我大一學 C 語言就百思不得其解,直到后來學了組成原理和數字邏輯。

          我們說計算機中一切都是 0、1,0、1 又是通過高低電平來表達的,通過與、或、非等邏輯門電路來表達二進制的數值運算,再將這些簡單的電路集成在一起,就形成了 ALU 等具有運算能力的處理器。

          你會看到一條指令是如何被CPU執行的,CPU 從內存或 Cache 中取出指令,放入指令寄存器,并對指令譯碼。譯碼就是按照指令的編碼規則,將指令拆分成一系列的微操作和操作數。然后發出各種設備控制指令,執行微操作。這樣就完成一條指令的執行。

          我們說學完編譯原理,能夠明白寫的英文代碼是如何被變成二進制指令的,學完操作系統能搞懂二進制程序是如何被鏈接在一起,又是如何被操作系統加載、執行的。而組成原理則會告訴你二進制指令是如何控制 CPU 跑起來的,我們的操作系統本質上也是一個二進制的程序。

          當你理解了計算機存儲層次結構,理解了多級 Cache,你就會通過優化數據訪問方式來編寫出速度更快的程序。

          你會學到底層體系結構對 C 這些語言的棧幀和參數傳遞的支持,參數是如何被傳遞給另外一個函數的?函數的返回值又是如何拿到。

          這是學習組成原理對于寫代碼的意義。

          學這些到底有什么意義?

          你會完整的看到寫的代碼如何變成二進制指令,又是如何去控制各種門電路,最后變成屏幕上花花綠綠的程序的(當然這里可能還需要學習顯示器的原理),這就是我們常說的“基礎”和“原理”。

          并且計算機體系結構中的很多思想,是能夠廣泛運用于現代軟件開發的,比如 CPU 的多級 Cache 思想,就是我們現在服務器開發中提高并發度常用的緩存技術,包括緩存的替換策略等等。

          當計算機對你不再是黑盒,你了解寫下的代碼到執行的每一步,而這也將成為你以后的核心競爭力,作為科班畢業生不應該只會使用 Java、Redis、Mysql、Spring 來寫各種網站。

          如果讀者里有半路轉行或者從培訓班出來的,也希望你們能夠抽出空余時間去補補這些基礎課,這會讓你在編程這條路上走的更遠和更穩。

          6、數據結構與算法

          為什么把算法放到最后來講,是不重要嗎?相反,它太重要了,所以才讓它來壓軸。

          如果要問我大學什么最后悔?那肯定是沒有從大一就開始好好學算法,去打 ACM。

          現在還在大一、大二的同學還不抓緊機會,別等到以后來后悔。當然,不打 ACM,我們也是能夠學好數據結構和算法的。

          數據結構和算法你能在任何計算機領域里看到,比如在編譯原理中寄存器的分配會用到貪心,死代碼檢測與消除會用到圖論里不可達的知識;操作系統進程、線程調度會用到多級隊列和調度算法;組成原理中 Cache 的替換會用到 LRU、FIFO 等算法;開發必備的數據庫也離不開 B+ 樹、LSM 等數據結構和查找算法。

          很多時候我們需要的算法都被封裝到編程語言的基礎庫里了,以至于很多同學會覺得算法離我們太遠,其實不是的。

          如果不學習算法,連什么時候用 Map(紅黑樹實現)、什么時候用 HashMap 都分不清。

          所以學習算法有助于我們根據應用場景選擇最合適的數據結構。

          日常開發中也一定離不開算法,比如小北最近工作中涉及的某種嵌套 TLV(Tag-Length-Value)結構編碼的解析,就需要用到遞歸、多叉樹等知識。如果不學習算法,那么程序中只能見到大量的 if/else、while/for。。。

          可以說不會算法的工程師一定不是一個優秀的工程師。

          7、為什么我不說計網、數據庫等

          很多人喜歡把計算機網絡、數據庫原理這些也歸為計算機基礎來,我當然也認同,因為一個知識結構完整的計算機科班學生,應該了解這些知識。

          但是我個人是覺得計算機網絡、數據庫無非就是建立在操作系統、編譯原理、組成原理之上的應用層軟件。

          什么是數據庫?沒有數據庫之前你會用文件去存儲數據,但是不方便查找、修改等,數據庫只是提高了這個過程的效率。

          網絡干什么的?網絡就是讓不在同一臺電腦上的程序互相通信,本質上就是進程間通信的手段。

          如果你只是開發單機工業軟件,甚至真的可以不學網絡,只是由于現在大多數程序員都是在互聯網公司工作,所以不管前后端,都離不開和HTTP等網絡協議打交道。

          再次重申:不是計網、數據庫不重要,只是我認為它們屬于構建在操作系統之上的軟件,不劃在基礎之列。

          領域知識

          這個我不敢說太多,因為各個領域我也不太懂。只簡單提一點,拋磚引玉罷了。

          如果你想去騰訊、網易做游戲引擎開發,那么圖形學一定是你繞不開的知識,此外你還得學習渲染管線、著色器、物理、光照等等。

          如果你想去 PingCap 這樣的公司做分布式存儲,那么分布式理論知識一定是你繞不開的關口,包括 CAP 定理、Paxos 算法、Raft 算法、ZAB 協議等等。

          如果你想寫一個數據庫,那么你需要去了解磁盤、索引實現、SQL 解析(編譯原理)、事務、如何用 MVCC 解決讀寫沖突等等一大堆的東西,還得了解一大堆編程語言層面的東西,比如鎖、信號量、并發編程技巧,不得不說造數據庫是一個臟活也是一個累活。

          更進一步你想去做分布式數據庫,那可能還得去學習數據分片的知識,查詢任務如何做,是集中做,還是將邏輯下推給各個節點,如何實現分布式事務等等。

          你說你只想去大廠 CRUD?沒毛病,老鐵!

          那你得熟悉一門編譯型語言(C/C++、Java、Go),理解語言部分底層原理,比如 C++ 你得看看 STL、看看對象模型吧,你不懂什么虛函數表、智能指針還想去騰訊寫 C++? Java 的你得背背 JVM,什么垃圾回收算法吧,你不看看ConcurrentHashMap 好意思說你是做Java的?

          咱CRUD的對象是數據庫吧?那不得學學怎么才能把數據庫用好。用戶通過 HTTP 訪問我們得服務,總得了解 HTTP吧?順帶著不看下 TCP 三次握手、四次揮手你好意思說是學計算機的?

          用戶把錢、信息放咱們這,總得保證用戶數據安全吧?那 XSS、SQL 注入、CSRF 這些常見的 Web 攻擊手段你總得了解吧?HTTPS、RSA、簽名、數字證書這些安全手段總得知道吧。

          雙十一流量太大,老板還讓你必須頂住,那你總得了解下緩存、異步、消息隊列、NoSQL 這些千萬 QPS 必備的大殺器吧?

          看看!要想做好CRUD也不是那么容易滴。

          (上面這段只是換一種方式把做后端的同學要學的知識寫出來,不是吐槽更不是調侃,純屬娛樂。

          技能

          這就很多了,包括 VSCode、Jetbrains 全家桶這些 IDE,文檔編寫 Markdown、Git 等版本管理工具。SSH 遠程登錄、端口轉發,Ngrok 內網穿透等等這些提高你開發效率的工具,都算是技能,這個沒啥好說的,平時用到多學習多積累就好了。

          我只提一點,盡早使用 Linux、類 Unix(Mac)作為主力開發電腦。我大二的時候,就是看了王 ying 的那篇《完全用 Linux 工作》,直接買了個 SSD 套上 U 盤外殼,做了一個啟動盤,后來用了將近一年的 Ubuntu,只有在選課、提交作業等需要用的 IE 瀏覽器的時候才會打開 Windows(這里不得不吐槽學校老古董網站!)

          當然了,我也不是狂熱的 Linux 愛好者,只是單純覺得做開發的話,離不開各種環境安裝、命令行的使用,這點上面類 Unix 系統帶有天然的優勢,誰用誰知道!

          總結

          寫完才發現,這篇文章連篇幅都是「基礎 : 領域知識 : 技能」 接近 7 : 2 : 1。

          這也是我推薦你在大學期間分配學習時間的比例,至少學習基礎知識的時間不少于 50%,當然,這些東西你都學完了那可以去找找感興趣的方向專研一下。

          千萬不要大一、大二一上來就扎進 Java Web、Python 爬蟲這種東西,這些可以學,但不是重點。

          這篇文章由于篇幅限制,沒有寫到具體該如何去學,有哪些好的資料,我準備把這個單獨再寫一個 《How 篇》,持續關注我喲~

          那么如何檢驗學得如何呢?

          想必你一定聽說這個計網面試題:“從 URL 輸入到頁面展現到底發生什么?“

          這個問題換個表達就是「一個數據包是如何發送到另外一臺電腦的」。

          如果你能完整的說出整個過程,那么計網你一定是學懂了!這就是為啥面試這么喜歡問這個問題的原因。

          那么我們依葫蘆畫瓢提一個問題

          “從代碼被寫下到程序運行起來到底發生了什么?”

          這個問題回答得越詳細越好,基本上能說清楚了,你就理解了編譯原理、操作系統、組成原理這三座大三。

          這個問題也放在這,后續發文總結,請持續關注編程指北哦。

          唉,當年要是有這么個貼心學長告訴我這些,也不至于在 Andorid 開發、Java Web、Python 爬蟲這些玩大半年啊。。。

          不過還好后來自己意識到了基礎的重要性,開始學匯編、重學C、搞 mini os、看 Linux 內核實現原理,最后成功的把頭發掉了一把。。。

          最后想送給你一句我挺喜歡的話:

          萬丈高樓高樓平地起,勿在浮沙筑高臺。

          點分享

          者:李玉亮

          JDEasyFlow是企業金融研發部自研的通用流程編排技術組件,適用于服務編排、工作流、審批流等場景,該組件已開源(https://github.com/JDEasyFlow/jd-easyflow),目前在部門的內部業務系統和科技輸出系統中廣泛應用,其他部門也有使用。

          它的特點是簡單、靈活、易擴展,開發人員一般30分鐘可入門上手,半天可掌握其原理。它分為一個核心模塊和若干擴展模塊,模塊之間松耦合,開發使用時可按需選擇、快速集成、漸進式應用,同時支持JSON內置規范和BPMN規范。它的實現原理也有其特色,后面有介紹。

          支持的場景功能

          節點流轉類型

          支持順序流轉、條件流轉、循環流轉等。


          ??

          節點功能類型

          支持腳本節點、用戶節點和消息節點。


          ??

          ?腳本節點:節點執行時運行一段代碼腳本

          ?用戶節點:根據用戶的操作指令觸發節點執行

          ?消息節點:接收消息后觸發節點執行

          節點串并類型

          支持串行執行、并行執行、串并組合執行等。


          ??

          流程交互場景

          支持單次交互一次執行多節點、多次交互一次執行一節點、多次交互一次執行多節點等。


          ??

          子流程場景

          JDEasyFlow支持子流程的場景,可將把復雜的流程節點拆分為子流程,便于業務邏輯抽象。


          ??


          審批流程場景

          JDEasyFlow提供了流程任務審批的能力;常用的審批、撤銷、駁回、會簽、加簽等功能都可支持;內置了簡單的動態表單。既支持從頁面發起和操作流程任務,也支持API的方式,京東OA審批系統也有對接。



          ??

          功能架構

          整體功能架構

          JDEasyFlow的功能架構如下圖,功能模塊之間松耦合, 開發時可按需選擇、快速集成、漸進式應用最簡單的使用方式為只在業務應用端引入jar包使用流程引擎。如果需要流程可視化功能,可集成BPMN規范模塊,如果還需要流程實例持久化、流程定義持久化等更豐富功能,則可以集成其他相關模塊。



          ??

          流程引擎模塊

          JDEasyFlow的核心模塊,此模塊提供了基于JSON格式的JDEasyFlow規范進行流程編排的能力,其他模塊均基于該模塊擴展,相當于流程執行的發動機、CPU。該功能模塊為獨立組件,無數據庫依賴,應用中引入jar包便可使用。

          BPMN規范模塊

          提供了基于BPMN規范進行流程定義和可視化的能力,流程可視化基于[bpmn-js](https://bpmn.io/),其本質為提供了將BPMN格式流程定義轉換為JDEasyFlow格式的能力。該模塊為獨立組件,僅依賴流程引擎模塊,無數據庫和服務依賴,應用中引入jar包便可使用。

          目前可支持常用的BPMN元素:

          ?任務:腳本任務、用戶任務、消息任務

          ?事件:開始事件、結束事件、消息接收事件

          ?網關:排他網關、并行網關、包容網關


          ??

          流程定義和實例管理模塊

          流程定義模塊支持流程定義的中心化、版本化管理,流程實例模塊支持流程實例的持久化和生命周期管理。該功能依賴數據庫,有服務端和ERP管理端。

          任務/審批模塊

          支持任務生成、任務分配等功能,常用的審批、撤銷、駁回、會簽、加簽等功能都可支持。該功能依賴數據庫,有服務端和ERP管理端。

          系統架構

          整體系統架構

          JDEasyFlow的完整系統架構如下,主要有三個端:業務應用端、流程服務端、流程管理端,三個端可部署在單體應用中,也可分開部署


          ??

          中間件依賴

          · 關系型數據庫(如Mysql)

          · 緩存(如Redis或R2M)

          · 服務通訊框架(如Java API調用或Http調用或JSF調用)

          數據庫數據模型比較簡單清晰,見下圖:


          ??

          性能說明

          · 如果僅是服務編排場景,則流程的執行僅依賴內存和CPU,并且是在流程客戶端執行,性能上依賴于客戶端服務器的性能,普通筆記本實測1秒可執行一個流程請求的1w+個節點,1秒可執行1萬+次含1個節點的流程請求

          · 如果需要流程狀態管理和流程持久化功能,流程引擎在執行時會到流程服務端查詢和保存流程實例和流程節點的狀態,性能上主要依賴于數據庫的查詢和插入效率

          · 對于流程任務審批功能,流程的任務審批流轉是在服務端執行,一方面取決于流程服務端的計算性能,另一方面同樣取決于數據庫的查詢和插入效率

          可伸縮性說明

          · 流程引擎屬于無狀態,可隨應用實例線性伸縮

          · 流程服務端應用實例支持線性擴展

          · 流程數據庫可通過分庫分表的方式支持大數據量的增長

          實踐建議

          在具體實踐中,建議部署統一的流程中心(見下圖),對流程定義統一管理。各系統的應用只需集成流程客戶端jar包進行流程節點開發和流程調用便可。如果系統只使用任務審批的功能,則只需要通過API和消息與流程中心交互便可。


          ??

          使用示例

          流程引擎使用示例

          在源碼的test目錄下有quickstart測試用例(easyflow\easyflow-flow\src\test\java\com\jd\easyflow\flow\quickstart\QuickStartTest.java),可直接運行或調試以了解使用方式和運行原理。具體實踐步驟如下:

          1、代碼中引入easyflow-flow jar包,以maven為例:

          <dependency>
                  <groupId>com.jd.easyflow</groupId>
                  <artifactId>easyflow-flow</artifactId>
                  <version>{替換為最新版本}</version>
          </dependency>
          
          

          2、編寫流程定義文件,以node001->node002→node003的執行順序為例:

          {"id": "quickstart_001", "name": "Quick Start 001",
          "nodes": [
            {"id": "node001","name": "Node001","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()"},"start": true,"post": {"to": "node002"}},
            {"id": "node002","name": "Node002","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()"},"post": {"to": "node003"}},
            {"id": "node003","name": "Node003","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()"}}
          ]
          }
          
          

          其中QuickStart001Node01Action等為java節點動作類。完整的流程定義配置項可見: https://github.com/JDEasyFlow/jd-easyflow/wiki/Flow-engine-usage (公網)

          3、編寫應用啟動時加載流程引擎的代碼

             FlowEngineImpl flowEngine = new FlowEngineImpl();
             flowEngine.setFlowPath("classpath:flow/quickstart/quickstart_001.json");
             flowEngine.init();
          
          

          Spring環境可直接定義FlowEngineImpl bean.

          4、編寫具體流程調用執行的代碼

              FlowParam param = new FlowParam("quickstart_001");
              FlowResult result = flowEngine.execute(param);
          
          

          完整測試用例的執行結果打印如下:

          [main           ] INFO FlowEngineImpl         - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json
          [main           ] INFO FlowEngineImpl         - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null
          [main           ] INFO BaseFlowRunner         - EXECUTE NODE:node001
          [main           ] INFO QuickStart001Node01Action - Execute Node 001
          [main           ] INFO BaseFlowRunner         - NEXT NODES:node002
          [main           ] INFO BaseFlowRunner         - EXECUTE NODE:node002
          [main           ] INFO QuickStart002Node01Action - Execute Node 002
          [main           ] INFO BaseFlowRunner         - NEXT NODES:node003
          [main           ] INFO BaseFlowRunner         - EXECUTE NODE:node003
          [main           ] INFO QuickStart003Node01Action - Execute Node 003
          [main           ] INFO BaseFlowRunner         - NEXT NODES:
          [main           ] INFO QuickStartTest         - Execute finish, current node is:node003
          
          

          BPMN模塊使用示例

          打開easyflow-flow-bpmn/BPMNDesigner.html流程設計器. 點擊導入按鈕,導入easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn文件,可在設計器中看到和以上JSON定義等價的BPMN流程定義.


          ??

          代碼集成使用時只需要將FlowEngineImpl的flowParser設置為BpmnFlowParser.

          更多

          以上只是流程引擎和BPMN模塊的簡單使用示例,JDEasyFlow還包含其他模塊、可支持很多的配置項和使用場景,更多使用可見最后的對接使用介紹.

          實現原理

          目前市面上的流程編排組件基本都是基于圖(邊和頂點)結構的,而本組件是參考了計算機指令執行模型而實現,借鑒了程序計數器的實現原理,引擎內部通過類似程序計數器(PC)的待執行節點棧來維護后繼節點;可以理解為是一種高級業務編程語言,它同時也是圖靈完備的。

          流程引擎核心模型名詞只有一個:節點(Node),節點的功能為執行邏輯并輸出后續節點 。


          ??

          開發態可定義有限的節點,通過每個節點與其后續節點連接形成有向圖;運行態按規則邏輯進行節點流轉,支持并行執行,支持順序、條件或循環,支持fork-join。


          ??

          概念:

          ?流程:一個業務流程的抽象

          ?節點:流程的組成單位,一個節點能夠執行節點動作同時可返回后繼節點

          節點內部構件:

          節點內部構件的組成是可自定義的,流程引擎提供了缺省實現,其內部構件包括了前處理器(PreHandler)、節點動作(NodeAction)、后處理器(PostHandler)


          ??

          ?前處理器:判斷該節點是否可以執行動作

          ?節點動作:真實的業務功能處理

          ?后處理器:負責計算后續節點

          流程引擎執行邏輯

          流程引擎有一個或多個流程觸發節點,流程觸發后執行如下邏輯:

          1. 初始化流程上下文

          2. 得到流程起始節點ID,放入執行棧

          3. 如果執行棧為空,則返回,否則執行當前節點

          1) 預檢查

          2) 執行Action

          3) 計算后繼節點ID并返回

          4. 將后繼節點放入執行棧,從棧中取出待執行節點,跳到第3步

          因此JDEasyFlow整體的特色為簡單

          ?模型簡單:核心模型概念就是節點的流轉

          ?擴展簡單:提供了監聽器、過濾器功能,方便橫向切面;節點支持自定義實現

          ?定義簡單:只需要通過JSON進行節點流轉邏輯配置便可,也支持BPMN格式

          ?運行簡單:代碼調用流程引擎,傳入流程ID和業務參數便可

          ?使用簡單:引入組件包便可使用,比較輕量


          ??

          適用場景和對接使用說明

          適用場景

          理論上JDEasyFlow可滿足任何流程場景,它主要可解決三類問題:

          ?流程可編排:將業務流程抽象為軟件流程,保證軟件是現實的真實反映;不同場景可定義不同流程,且流程易修改

          ?功能松耦合:將業務節點抽象為軟件流程節點,一方面實現功能的松耦合,另一方面實現節點的可復用

          ?流程可視化:所見即所得,方便業務產品人員和軟件研發人員基于同一語言的交流,也便于流程監控

          在實際軟件系統開發過程中,如果有如下訴求,可考慮使用流程編排:

          ?業務流程是有明顯的多個節點組成

          ?希望流程可靈活變更

          ?業務流程級別比程序流程高一層,在編程語言級別難以聚合和治理(如一個流程即需要前臺操作,又有外系統參與,又有后臺操作,在實現上入口分散)

          對接使用

          JDEasyFlow的所有文檔可見: https://github.com/JDEasyFlow/jd-easyflow/wiki

          歡迎大家對接使用,有相關使用問題可聯系: liyuliang5@jd.com


          主站蜘蛛池模板: 久久国产午夜精品一区二区三区| 无码人妻精品一区二区三区久久 | 精品无码一区二区三区水蜜桃| 性色av闺蜜一区二区三区| 亚洲日韩中文字幕无码一区| 国产成人无码精品一区不卡| 精品人妻少妇一区二区| 久久伊人精品一区二区三区 | 天天躁日日躁狠狠躁一区| 国产伦精品一区二区三区免费迷| 91成人爽a毛片一区二区| 国精品无码A区一区二区| 精品女同一区二区| 人妻少妇精品视频三区二区一区| 亚洲制服中文字幕第一区| 国产成人精品a视频一区| 福利一区在线视频| 在线观看视频一区二区| 伊人色综合一区二区三区影院视频 | 色综合视频一区二区三区44| 人妻无码久久一区二区三区免费 | 成人精品一区二区三区校园激情 | 波多野结衣电影区一区二区三区| 99久久精品午夜一区二区| 农村乱人伦一区二区| 午夜天堂一区人妻| 亚洲第一区香蕉_国产a| 国产免费一区二区视频| 国产成人一区二区三区在线| 香蕉免费看一区二区三区| 久久婷婷色综合一区二区| www一区二区三区| 亚洲日本中文字幕一区二区三区| 国产AV天堂无码一区二区三区| 在线免费一区二区| 国产一区二区三区手机在线观看| 欧洲精品一区二区三区| 国产伦精品一区二区三区免费下载 | 日本一区二区三区精品国产 | 麻豆一区二区三区精品视频| 色噜噜AV亚洲色一区二区|