彈琴與MCModding教學(xué)

條條大路通羅馬,有的人生在羅馬,有的人離羅馬近,有的人在另一塊大陸上。
就目前的世界來(lái)看,“公平”,并不是說(shuō)每個(gè)人都享有同等的待遇,也不是每個(gè)人同等的付出會(huì)有同等的收獲,而是,“每個(gè)人都可以努力”,僅此而已了。
【由基本要素構(gòu)成的序列,逐漸精深】
會(huì)演奏樂(lè)器,不是指會(huì)演奏音階從do到ti,而是指可以演奏曲目。
我的小學(xué)音樂(lè)課教口琴,然而我學(xué)的成果不怎么樣。我知道該怎么吹每個(gè)音,但是我的手和嘴沒(méi)有那么協(xié)調(diào)。小時(shí)候和長(zhǎng)大后我家都買過(guò)葫蘆絲(一種半葫蘆半笛子的樂(lè)器,那個(gè)年代的廟會(huì)經(jīng)常有賣的),我看了說(shuō)明書(shū)也知道如何吹奏do-re-mi-fa...但也吹不出曲子。小時(shí)候我爸還買了個(gè)吉他,我也大概知道了吉他奏每個(gè)音是怎么按的,按我依舊彈不出什么曲子。
類似地,每個(gè)人的電腦都有鍵盤,對(duì)著鍵盤上的標(biāo)記敲26個(gè)字母大家都會(huì),但這不等于每個(gè)人都會(huì)打字或者寫代碼。我媽不會(huì)輸入@#¥%這樣的符號(hào),我跟她說(shuō)按住shift,她也就會(huì)了。雖然有時(shí)會(huì)忘,多說(shuō)幾遍也就記住了。剛上大學(xué)那會(huì)兒,我試著教過(guò)我媽寫一個(gè)簡(jiǎn)單的c語(yǔ)言程序,我媽確實(shí)可以在我的指導(dǎo)下完成,但就像她本人所說(shuō),沒(méi)有我的指導(dǎo)肯定寫不了。
只是知道基本操作并不夠,需要的是能推導(dǎo)或者記憶過(guò)程,并在合理的時(shí)間內(nèi)完成這些操作。如果音符與音符之間隔得太長(zhǎng),那就聽(tīng)不出曲子了。如果寫個(gè)把字符串打印到屏幕就需要幾個(gè)月,那也就別指望能寫出多么大的程序了。
在演奏樂(lè)曲的時(shí)候,基礎(chǔ)是能記住曲譜,或者以足夠快的速度閱讀樂(lè)譜。寫代碼的時(shí)候,對(duì)速度沒(méi)有那么敏感,但是根據(jù)語(yǔ)法規(guī)則,把字母、數(shù)字、符號(hào)組裝成可以實(shí)現(xiàn)某些邏輯的能力不可或缺。
實(shí)際上,以我的水平來(lái)看,我是在組合變量名、if、for括號(hào)等東西,字母這種事我是直接忽略的,會(huì)寫代碼的各位讀者想必也是如此。更高級(jí)一點(diǎn)的程序員,或許是在拼接算法塊,但我算法做的不深,沒(méi)有體會(huì)。我的類似體會(huì)是做mod的時(shí)候,“我想召喚一個(gè)具有XXX特性的實(shí)體”,這一句話所代表的三行代碼就像一個(gè)單詞那樣自然而然地寫出來(lái)了;“我想寫一個(gè)空白物品作為合成材料”,我就會(huì)毫不猶豫地public static final……不不不,我會(huì)毫不猶豫地復(fù)制前面寫好的東西然后改一下,那樣更快。
不論是彈琴還是做mod,都有一個(gè)逐漸精深的過(guò)程,不過(guò)精深的方式不太一樣。
如果你看郎朗的大師課,他會(huì)去重點(diǎn)強(qiáng)調(diào)力量和節(jié)奏的控制,哪個(gè)音是裝飾音,但他并沒(méi)有讓你把不同的整首曲子拼在一起越拼越大。他最多就會(huì)從音符拼小節(jié),再拼成樂(lè)句、篇章、曲目,最多再把不同的幾個(gè)曲目組合再一起了,再拼時(shí)間就太長(zhǎng)了。畢竟他不是知名作曲家,而是演奏家,側(cè)重的方向有所不同。
代碼有很多個(gè)精進(jìn)的方向。固然它也有控制格式和寫法,使得代碼可讀性高、穩(wěn)定性強(qiáng)的那一面,但它層層封裝的一面也不容忽視。就像把細(xì)胞拼成組織,組織拼成器官,器官拼成個(gè)體,個(gè)體拼成種群那樣,把一大套代碼封裝成一個(gè)接口去供其他代碼調(diào)用,以至于需要執(zhí)行某個(gè)任務(wù)的時(shí)候,只要下令某個(gè)模塊去工作,那個(gè)模塊內(nèi)部的諸多零件就會(huì)協(xié)調(diào)運(yùn)作,實(shí)現(xiàn)一個(gè)復(fù)雜的功能。背誦圓周率5位,對(duì)于大多數(shù)人來(lái)說(shuō)沒(méi)有多難,但對(duì)一個(gè)細(xì)胞來(lái)說(shuō)就……代碼的運(yùn)行效率夠高后,這個(gè)拼裝的過(guò)程幾乎是無(wú)限持續(xù)的,多么復(fù)雜的拼裝代碼,封裝后都可以當(dāng)做幾個(gè)接口去調(diào)用,然后再去拼成更復(fù)雜的東西。當(dāng)然代碼也不光是由小拼大,一層摞一層,越摞越厚但是上層越來(lái)越小的也不是沒(méi)有——我們大多數(shù)人寫的程序可比操作系統(tǒng)簡(jiǎn)單多了。
在我們的生活中,這種拼裝的例子比比皆是。音符一層層拼成旋律,筆觸一點(diǎn)點(diǎn)構(gòu)成畫(huà)作,文字一點(diǎn)點(diǎn)構(gòu)成文章,工人一位位構(gòu)成工序,零件一個(gè)個(gè)拼成機(jī)器,磚塊一個(gè)個(gè)蓋出房子,代碼一行行拼成程序,題目一道道構(gòu)成試卷……這些拼裝的過(guò)程,尤其是創(chuàng)作和高速執(zhí)行這種拼裝序列的過(guò)程,基本都涉及逐漸精深。
【乘興而來(lái),從入門到放棄】
看到Synthesia這個(gè)軟件后,我又買了一個(gè)電子琴。出乎意料的是,這個(gè)電子琴附帶一個(gè)手機(jī)APP,也具有和Synthesia類似的功能,那就是把譜子可視化,教我彈琴。只不過(guò),Synthesia可以可視化任何midi格式的樂(lè)曲,但這個(gè)APP只有少數(shù)幾個(gè)它提供的。但這個(gè)APP更進(jìn)一步,還標(biāo)了用哪個(gè)手指。

我簡(jiǎn)單地學(xué)了一下如何操作音色,試了試手感之后,就開(kāi)始嘗試APP里的……《紅蓮華》,也就是動(dòng)畫(huà)《鬼滅之刃》的主題曲。顯然這不是一首適合新手彈的曲子,花了幾個(gè)小時(shí)我也勉強(qiáng)能跟下來(lái)譜子了,這還只是單手。單手的失誤率和跟拍率,甚至沒(méi)有達(dá)到解鎖雙手的標(biāo)準(zhǔn)。
然后我又做了什么呢?我和表妹討論了下要不要錄個(gè)節(jié)目,我彈《好運(yùn)來(lái)》她抽卡。然而,我發(fā)現(xiàn)我根本沒(méi)有耐心學(xué)下來(lái)包含前奏的《好運(yùn)來(lái)》。就算是我譜子記住了個(gè)大概的《讓我們蕩起雙槳》,我也完全沒(méi)耐心按照他的指法彈——同時(shí)操心用的手指和要彈的音對(duì)我來(lái)說(shuō)過(guò)于困難了。
再接下來(lái),我從網(wǎng)上搜到了《原神》《彈丸論破》的midi配樂(lè),把琴插到電腦上,選擇其中主要的聲部開(kāi)始彈。這是正確的學(xué)習(xí)路徑嗎,顯然不是。然而,如果要我遵守正確的路徑一板一眼地練習(xí)指法和練習(xí)曲,我可能兩天就棄坑了,興趣全無(wú)。畢竟,我甚至連五線譜都不會(huì)認(rèn),充其量認(rèn)個(gè)簡(jiǎn)譜,基礎(chǔ)差到幾乎沒(méi)有。我學(xué)琴的興趣就是想彈出那些印象極深的曲子而已,對(duì)成為一流演奏家沒(méi)太大興趣,對(duì)于使用正確的手指則更無(wú)興趣。如果我本身就會(huì)鋼琴,或者之前有更好的手眼協(xié)調(diào)性練習(xí),恐怕不會(huì)這么拒絕指法追求。
雙手彈奏?單手和弦?再見(jiàn)再見(jiàn),我不彈那么復(fù)雜的。
看到我的視頻教程,來(lái)學(xué)mod的人也是各式各樣?!跋胱鰉od”這種愿望,無(wú)論是否會(huì)編程,都會(huì)發(fā)生。然而,不會(huì)編程的人來(lái)學(xué),就會(huì)非常痛苦。
拋開(kāi)搭建環(huán)境的玄學(xué)不提,做出第一個(gè)物品先要注冊(cè)這個(gè)、注冊(cè)那個(gè),寫個(gè)物品基類出來(lái),寫兩三個(gè)json并放到對(duì)應(yīng)目錄,弄不好還要手繪貼圖,這就夠麻煩了。其中還有無(wú)數(shù)等著翻錯(cuò)的陷阱,json更是極其容易寫錯(cuò)。即使這步?jīng)]有勸退,到后面做實(shí)際需求就更難了。
群里有個(gè)人想要做個(gè)物品,效果是點(diǎn)擊右鍵就會(huì)發(fā)射煙花火箭,他根本不知道煙花火箭的細(xì)節(jié)多麻煩,光是從玩家的角度理清煙花火箭有哪些參數(shù)、怎么配置才好看就夠煩了,還要給生成的火箭設(shè)計(jì)、設(shè)置這些參數(shù),不會(huì)java就算了吧。
正確的路途,當(dāng)然是學(xué)習(xí)java,知道如何利用面向?qū)ο蠹軜?gòu),知道基本語(yǔ)法,自己能使用if和for組合出各種東西來(lái)。我大學(xué)剛?cè)雽W(xué)的那會(huì),有一個(gè)作業(yè)題是用c語(yǔ)言輸出如下的內(nèi)容:
*
**
***
**
*
大概如此,每行星號(hào)遞增然后遞減。雖然都知道了for、while、if、printf的語(yǔ)法,但是有的人并不能想出如何拼出這么個(gè)東西。這需要的更像是一種解題能力,或者說(shuō)是小學(xué)奧數(shù)的那種分析能力。
我先把問(wèn)題的解決分為三步:理解實(shí)際需求,分析出抽象架構(gòu),并把架構(gòu)用代碼寫出來(lái)。這三步里面,分析抽象架構(gòu)的方式很難教——簡(jiǎn)直就是在教人如何思考嘛。我不想教這種東西。但是,如果一個(gè)人連這個(gè)都分析不出來(lái),那指望他去自己設(shè)計(jì)架構(gòu)實(shí)現(xiàn)需求,難度可想而知。
所以我的初級(jí)教程很簡(jiǎn)單,都是“你抄代碼就行”。我甚至把注冊(cè)和基類都給寫好了,直接一行public static final就能寫出個(gè)新物品。我也完全示范了簡(jiǎn)單的事件操作傷害,并留給了觀眾數(shù)值上2改3的空間,說(shuō)了如何上buff、治療,并表示可以組合。
然后,有人抄都抄不對(duì)。
EntityLivingBase hurtOne = event.getEntityLiving();
抄成
EntityLivingBase.hurtOne = event.getEntityLiving()
亂加點(diǎn),不寫分號(hào),然后截圖到群里問(wèn)……老天,自己先學(xué)java吧。群友的時(shí)間不是用來(lái)彌補(bǔ)你不會(huì)編程或者看視頻時(shí)的疏忽的。如果你能抄對(duì),那么自不用說(shuō),一切都好;如果抄都抄不對(duì),難道還要來(lái)麻煩別人嗎?連我,都懶得管這種事。我會(huì)糾正一次并予以嚴(yán)重警告,勒令下次自行處理,這就夠給面子了。能讓我親自下場(chǎng)糾正一次這種低級(jí)錯(cuò)誤,就感恩戴德吧,這種一般都是直接一個(gè)“滾”或者“go learn java”完事的,連糾正都不糾正。
抄對(duì)了后,有人把我事件里的代碼復(fù)制到別處,然后發(fā)現(xiàn)根本不能用——畢竟,“hurtOne.heal(2f)”,只有在你聲明了變量hurtOne為EntityLivingBase的時(shí)候才有意義。很多人連hurtOne的聲明都不復(fù)制過(guò)來(lái),那怎么指望代碼好使呢?編譯都不能過(guò)。凡是我沒(méi)有完全示范的地方,寸步難行,這就是不會(huì)編程的后果。要想學(xué)習(xí),非得自己學(xué)習(xí)編程不可。
學(xué)習(xí)編程要多久?那可不是看個(gè)五分鐘或者半小時(shí)的教程就能會(huì)的,這東西不是抄,而是理解的。不同人悟性不同,速度會(huì)有差別。另外,每天學(xué)八個(gè)小時(shí)和看五分鐘也不一樣,這就導(dǎo)致有的人只需兩天,有的人可能要學(xué)個(gè)一年。我們?cè)诖髮W(xué)的時(shí)候,先學(xué)了c,小學(xué)期只有兩周,就速成c++基礎(chǔ)。我工作后,留給我學(xué)lua的時(shí)間只有兩天,而那也完全夠了——這都是建立在前面先用c學(xué)會(huì)了編程的基礎(chǔ)上。有人問(wèn)我要多久,我無(wú)法給出明確的答案——畢竟編程不是靠時(shí)間耗出來(lái)的。考了駕照,放著幾年不開(kāi)車也可以解鎖上高速的權(quán)限,但學(xué)習(xí)編程,全靠自己。
西天有多遠(yuǎn),幾日可達(dá)?勿問(wèn)多遠(yuǎn),走就是了。心中之路,唯有自己可知。
若你恰好是計(jì)算機(jī)系或者軟件工程系畢業(yè),那看我的視頻甚至覺(jué)得太簡(jiǎn)單了,可以去看harbinger那種文字教程。這種情況下,我去指導(dǎo)一個(gè)很有基礎(chǔ)的人,一點(diǎn)就透,大家都開(kāi)心。這種例子我也遇到過(guò),也是我運(yùn)營(yíng)我湖中Mod社群的動(dòng)力。
中國(guó)十多億人,有多少人是計(jì)算機(jī)相關(guān)專業(yè)?有多少人會(huì)英語(yǔ)?別說(shuō)計(jì)算機(jī)專業(yè),上過(guò)大學(xué)的人又有多少?多少人被分配進(jìn)職高了事?我非常清楚,雖然就我所生活的地方而言,我是個(gè)沒(méi)考進(jìn)清華、沒(méi)進(jìn)大廠高薪的失敗者,但這已是蕓蕓眾生難以登攀的高度。北郵確實(shí)比清華差一個(gè)檔,但考不進(jìn)北郵的可以說(shuō)是大有人在。
我視頻的真正受眾,可以說(shuō)是少之又少?;颈P不大,我在b站的播放量和關(guān)注數(shù)也不會(huì)高到哪里去。這不光是視頻質(zhì)量的問(wèn)題,這是市場(chǎng)現(xiàn)狀的問(wèn)題。就算砸錢推廣,也漲不了多少粉,除非我把我的視頻更大眾化。但我的教程這種東西,越是淺顯,限制就越大。教會(huì)空白道具固然簡(jiǎn)單,但是能做的事也很少。我希望我做的事,是有意義的,有目前無(wú)人企及之處的,而不是完全被其他幾位的教程覆蓋。
我,希望在我死后能給這世界留下些什么。要像流星劃過(guò)夜空,之后也要給世界留下隕石,作為曾經(jīng)存在過(guò)的證明。各色視頻也好,《理想境》也好,這才是我的追求。教程,不過(guò)是這個(gè)追求的副產(chǎn)物罷了。
如果這個(gè)教程沒(méi)能照顧到一些觀眾,那我也只能說(shuō)聲抱歉了,蕓蕓眾生太參差,我無(wú)法照顧所有人,也許被遺落的人正是你。
如果是那樣的話……找別人嗎?不,也許根本沒(méi)有人會(huì)度你。指望別人來(lái)度本來(lái)就是一件很依賴環(huán)境的事,環(huán)境是什么樣的都有可能。
但就像我開(kāi)頭說(shuō)的,至少你可以選擇努力。也許有人一輩子都到不了羅馬,但他可以努力前往羅馬,也只能努力。人用弓箭射不到月亮,但人可以一直朝著這個(gè)目標(biāo)練習(xí)。
這便是這幾年來(lái)我感受到的,殘酷的現(xiàn)實(shí)?,F(xiàn)實(shí)的存在形式不在乎人是否喜歡,因?yàn)楝F(xiàn)實(shí)就是現(xiàn)實(shí)。