基於自然語言的軟體工程和程式設計(上)

2022-01-31 15:26:48 字數 2976 閱讀 3477

軟體發展至今,無論是程式語言,還是軟體工程,乃至是網際網路的趨勢發展,都是飛速發展。於是,我們便迷茫於這樣形形色色的語言和概念之間,無所適從。其實,我們不妨返璞歸真,回到最初,讓我們從語義出發,來討論這形形色色的種種,你是否恍然大悟呢?

1. 何為語義

我們無論是在程式設計,還是在架構乙個完整而龐大的軟體,總結起來,無外乎在構建乙個場景,或者說,在搭建乙個虛擬的世界。

那麼我們在回想一下我們在小學寫作文的過程,無外乎也是在描述一段場景,或者是重繪當初的場景,也就是老師常說的要寫真人,寫真事,抒發真實情感;或者是描述自己虛幻的場景,或表達夢境,或表達理想。

讓我們對比這兩件事情,我們會發現,他們都是在用語言構建乙個世界,唯一不同的只是乙個是用我們的自然語言,乙個是用我們的計算機語言,只此而已。

那麼,當我們埋怨我們被無數的概念所砸到,被無數的程式設計思想所淹沒的時候,埋怨著設計無從下手的時候,我們是否可以去嘗試著返璞歸真,用我們小時候最擅長的作文來反過來思考這些問題呢?說白了,也就是從自然語言向計算機語言,或者是自然語言思維向計算機語言思維的轉化過程。

這就是我想在本文中提出的,針對自然語言的程式設計。

2. 看程式語言的發展

讓我們先來**下程式語言的發展。

從第一代語言開始,當時的世界只有0和1,偉大的程式設計師們靠著向紙帶上打孔來程式設計。

而後到了第二代產生了組合語言,程式設計師們可以用一些指令來操作記憶體,從而達到自己想要的效果。

在我看來,機器語言到組合語言的轉變絕對是乙個質的飛躍,不僅代表著軟體和硬體地分離,更是程式設計師們可以用自己的語言(類英語)來表達自己的想法

在之後就產生了過程式語言,這裡以c語言為代表,這時也產生了一種程式設計思想,叫做面向過程的軟體設計。程式設計師們可以用自己的思維去思考問題:這個事情應該先做什麼,後做什麼,而每個步驟就是乙個方法。我們也稱之為自頂向下的軟體過程

隨著軟體的發展,軟體越來越龐大,功能越來越多,從軟體過程的角度來講,我們可以說,樹頂越來越多,我們再也無法像曾經一樣,抓住乙個或少數的樹頂,然後向下延伸,這時,便產生了近十年的熱潮:物件導向的軟體設計。

物件導向的軟體設計是考慮,這個有哪幾個物件,每個物件都能幹什麼,從而根據物件的協作去完成乙個大的任務。而每個物件對其他的物件都是不知情的,也就是說每個物件都可以不去關注整個軟體的整體業務邏輯,我也把這個特性稱為軟體對物件的透明性

在旁支,又產生了函式式語言,面向服務的軟體設計,面向契約的軟體設計,並髮式程式設計等形形色色的概念,而這些,我會在下文中來簡要**。

3. 思維成熟的歷程

短短地幾十年,看軟體世界的變革,你是否有些無所適從呢?那麼,在未來的軟體世界裡,也就是在我們未來的工作裡,程式語言又會變成什麼樣呢?當面向過程與物件導向這些我們熟悉地概念被時代所拋棄後,我們又該何去何從呢?

好,我們先不去想這些煩心的事,讓我們向前追溯,回歸童年時代,來想想我們寫作文的歷程。

從幼兒園時,我們不認識幾個字,我們想寫一篇文章,想的不是我們怎麼樣構建好乙個場景,而是我們要如何把我認識的這些有限的字用上,而最後故事的過程,我們不得而知。這時,我們不是在為了寫作文而寫作文,而是為了可以向大人們展示,我認字的多少。這不正像最初的機器語言時代麼?我們關注的是0和1的組合,把自己的著重點都放在了詞彙之間的組合上,而一些程式設計師卻常常會為此忽略了整個巨集觀的程式。

接下來,我們上了小學,我們不再沉迷於生字,生詞的堆積,我們學會了很多漂亮的句子,詩詞,名言警句,那麼這裡,我們可能關注的是,我們如何更好地組織這些句子,讓整個文章讀起來更通順,也是在小學時,誕生了中國經典的語文題目:改病句。好,我們來想想組合語言,組合語言把0,1**封裝,暴露給我們乙個個操作記憶體和運算的指令,我們需要關注的是我們怎麼樣把這些指令組合到一起,是先mov然後add然後中斷,抑或是……..否則,整個程式很可能都因此崩潰。

然後,我們上了初中,我們開始寫記敘文,這時的情節非常簡單,出場人物很少,這時,老師向我們灌輸了經典的「三段論」思想:事情的起因是什麼,事情是什麼樣的,事情的結果是什麼。當我們構思一篇文章的時候,需要做的就是把這件事情考慮清楚,然後按照順序去一件事情一件事情按順序去寫,這也就是我們的面向過程程式設計。

當我們長大了,成熟了,當時韓寒,郭敬明,安妮寶貝,以及越來越多的網路**讓我沉迷上了構造乙個個悲情的故事,故事的主角開始多了起來,主角之間都有著錯綜複雜的關係,三角戀,甚至四角戀的橫行,以及多故事線索的穿插,讓我們曾經的思維越來越不夠用。於是,就產生了一種當時我很痴迷的格式,在文章開始,我會首先介紹所有的故事主角,然後根據他們的角色去划他們的關係,行為。這就是我們的物件導向軟體設計。

由此可見,軟體設計思想的發展其實和我們的思維是一樣的,是隨著世界的複雜性的增加而調整設計的思維,調整我們思考問題的方式和出發點。

4. 未來的發展歷程

在前文我們說到,世界的複雜性增加驅動著軟體工程思維的成熟,那麼我們關注未來軟體工程的發展方向,實際上也就是在關注未來軟體世界,也就是軟體業務,需求的發展方向,也就是關注未來人們需要什麼樣的軟體。然後從自然語言出發,究竟怎麼樣的組織思維可以更好地我們所要構建的虛擬世界。

同樣,當我們理解乙個全新的軟體思維時,如果我們無法理解,我們不妨去思考著與之對應的自然語言思維。

諸如面向服務的概念產生時,其實是不是,我們在借用著其他文章的結果或者結局呢?比如我想寫一篇作文,其中有乙個場景是我想抨擊**,我可能就直接說「劉和珍君的死,在今天是否依然會重演呢」,這裡我只是引用了,或者說是借用了魯迅先生所為我搭建好的場景,而只關注其結果,然後對外展示,或者作為我整個文章過程的乙個小插曲。如果我們沒有面向服務,那麼我們是不要要再把整個《紀念劉和珍君》的文章再重寫一次呢?

下文簡介:

謝謝!

基於深度學習的自然語言處理

cbow表示可以通過求單詞表示向量和或者通過將乙個單詞詞袋向量乘 以乙個每一行對應於乙個稠密單詞表示的矩陣 這樣的矩陣也叫作嵌入矩陣 embedd i ng matricy 來得到。網路中每行神經元的值可以看作是乙個向量 全連線層可以看作是從四維到六維 的線性變換。全連線層實現了乙個向量與矩陣的乘法...

軟體和軟體工程的區別

最近在實施乙個專案,從設計到實現,慢慢的有些混淆了我當初對軟體的感覺,對編碼的感覺,當時就是覺得這東西挺有意思,從這裡面還可以懂得很多的道理,可現在這種感覺正慢慢的消失,也許最近有些忙碌,無暇去思考別的東西,但總有一種不是很好的感覺,如果說寫程式可以被機械的完成,那麼我是否還應繼續這樣做下去,去完成...

軟體工程的定義和分類

什麼是軟體?軟體是計算機系統中與硬體相互依存的一部分,它是包括程式,資料和文件的集合。特點 1 抽象性,是一種邏輯實體,不是具體的物理實體。2 沒有明顯的製造過程 3 沒有磨損老化現象 4 對於系統有著不同程度的依賴性 5 尚未完全擺脫手工藝的開發方式 6 本身是複雜的 6 成本相當昂貴.軟體的分類...