寫在前面
在上一篇筆者的作業感悟【一】筆者講到了一些個人經歷,幫助大家從思維上學生轉換到社會人士,在思維成功轉換以后,接下來我們就要學會干活,除了一些比較惡劣的職場環境,大部分職場都是把活干好了才能拿到報酬,因此這里筆者想給大家分享一些拙見,幫助大家能夠把活干好
問題解答
問題一:要不要刷演算法題?
這個問題相信是很多同學都一定會問的,甚至很多同學會說,我看到有些同學即便不刷演算法題,也能拿到高薪的作業,那么我是不是不刷演算法題我也能在職場中混得還行?
筆者的回答是必須刷,筆者在這里不想從比較功利的角度討論,大廠面試演算法占了多少比重,我們回歸到作業的本質來說,
想必大家都知道,計算機是一個傻瓜,沒有獨立思考能力,我們說前進他不會后退,我們說往東他不會往西,那不知道大家有沒有想過,我們作為開發,我們在拿什么指揮它作業,
另外想必也會有感觸,我們把自己寫好的代碼講給一個門外漢聽的時候,我們會發現,即便我們不和他們講任何專業知識,他們也一樣聽不懂我們在說什么
事實上,這看似毫無關聯的兩件事,其實正好是人和計算機互動的正反兩面
前一個是人走向計算機,我們要把我們的想法傳輸給計算機,讓它作業
后一個是計算機走向人,我們要把計算機的作業內容還原成人能理解的想法
而連接這兩個主體的是什么,就是演算法
我們來回顧一下演算法的基本概念
演算法是一系列解決問題或執行任務的步驟,它描述了在給定輸入后,通過一系列有限步驟來產生所需輸出的程序,演算法在計算機科學和數學中被廣泛應用,
演算法的特點如下:
-
明確定義:演算法必須具有明確的輸入和輸出,以及一系列明確定義的操作步驟,
-
可執行性:演算法必須是可執行的,即可以實際運行并產生結果,
-
有限性:演算法必須在有限的時間內運行結束,
-
輸入:演算法可以接受一個或多個輸入,
-
輸出:演算法可以產生一個或多個輸出,
-
確定性:每個步驟都必須具有唯一確定的含義,不會產生二義性,
-
結構化:演算法可以由基本操作和控制結構(如順序結構、分支結構和回圈結構)組成,形成一個結構化的整體,
-
有效性:演算法應該有效利用計算機資源,如時間和空間,
-
可讀性:演算法應該易于理解和閱讀,
通過設計高效和優化的演算法,可以提高問題的解決效率,減少計算資源的使用,滿足實際應用的需求,
同學們再回想一下平時做演算法題的時候,是不是三個階段
- 先理解自然語言的問題描述
- 轉換成有限計算機作業步驟
- 最后根據你寫的步驟來寫編程語言
我給大家舉一個例子:經典背包問題
問題描述
給定一組具有重量和價值的物品,和一個限制總重量的背包,要求在不超過背包總重量的前提下,選擇一些物品放入背包,使得放入背包的物品總價值最大化,
演算法步驟
- 定義一個二維陣列dp,其中dp[i][j]表示在背包容量為j的情況下,前i個物品的最大價值,
- 初始化dp陣列的第一行和第一列為0,表示沒有物品或者背包容量為0的情況下,最大價值都為0,
- 對于每個物品i,遍歷所有背包容量j,如果物品i的重量小于等于背包容量j,則可以選擇將物品i放入背包,此時背包容量變為j-w[i],最大價值變為dp[i-1][j-w[i]]+v[i],即考慮前i-1個物品,在背包容量為j-w[i]的情況下的最大價值加上物品i的價值,
- 如果物品i的重量大于背包容量j,無法將物品i放入背包,最大價值保持為dp[i-1][j],
- 比較將物品i放入背包與不放入背包兩種情況下的最大價值,取較大值作為dp[i][j]的值,
- 遍歷完所有物品和背包容量后,dp陣列右下角的值即為問題的解,即在限制背包容量的情況下,可以放入背包的物品總價值最大化,
代碼實作
public class KnapsackProblem {
public static int knapsack(int[] weights, int[] values, int capacity) {
int n = weights.length;
int[][] dp = new int[n+1][capacity+1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= capacity; j++) {
if (weights[i-1] <= j) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1]);
} else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n][capacity];
}
public static void main(String[] args) {
int[] weights = {1, 2, 3};
int[] values = {6, 10, 12};
int capacity = 5;
int max = knapsack(weights, values, capacity);
System.out.println("Maximum value that can be obtained: " + max);
}
}
結論:演算法之所以被稱為內功心法,指的是一個人能在計算機思維和自然人思維中熟練地來回切換,因此演算法很重要
問題二:現在學什么語言比較合適?
之所以大家現在整天想著學什么好就業,是人心浮躁的后果,這個時代大家都喜歡掙快錢,但是筆者提醒大家,來得快的東西往往去的也快,很多中了頭獎的家庭,往往最后的結局并不會多圓滿
筆者認為,除非你現在學的是就業面特別狹窄的技識訓者特別老舊的技術,例如VB語言,Pascal語言啥的,筆者現在見到的確實是不多
一般情況下沒有必要換,你有幾十張一塊錢,也抵不過別人一張一百塊
那么有同學會問,萬一我學的技術若干年后過時了怎么辦,筆者認為也不用擔心
學到深處很多東西是相通的,像C++,Java都是面向物件編程,要過渡過去是不需要完全從頭開始的
結論:除非現在學的就業面特別窄或者過時了,否則沒有必要特地去換或者追求新技術
問題三:作業中老是curd怎么辦?
說實話,筆者自己也才作業了一年,加上筆者技術一般,也沒有分到啥特別高端技術的專案,那么筆者的建議是什么,就是嘗試著從程式員走向軟體工程師,筆者之前在博客中強調,要有工程化思維,很多同學軟體工程這門課可能背的很熟,也是少有的能夠在筆試中輕松通過的考試,畢竟沒有敲代碼
但是同學們捫心自問一下,在作業中真正用到這門課知識的部分有多少,同學有沒有嘗試過用工程化的思維來作業,例如你參與一個專案只是拿到需求就開始敲,還是縱觀整個專案做一份開發報告,做測驗有沒有自己寫過測驗報告,后續和其他崗位的交接有沒有記錄
筆者最深刻的印象就是我那些同事開專案會議的時候,都是進了會議室打開execl或者word臨時寫一個會議記錄,而不是帶著進度報告來討論哪里有問題,那怎么可能做得出名堂來,典型的頭痛醫頭,腳痛醫腳
作業中用不到軟體工程,那怎么能叫軟體工程師呢
程式員和軟體工程師在職責和作業范圍上存在一些區別,以下是它們的區別:
-
職責:
- 程式員主要負責撰寫代碼,實作軟體開發程序中的具體功能和邏輯,
- 軟體工程師則更加關注整個軟體專案的生命周期,包括需求分析、設計、開發、測驗、維護等,
-
角色:
- 程式員通常是一個團隊中的一個成員,負責根據規范和設計方案撰寫代碼,
- 軟體工程師通常扮演著專案或團隊的領導者或決策者的角色,負責專案管理、技術選型、架構設計等,
-
技能要求:
- 程式員主要需要具備編碼的技能和經驗,例如掌握各種編程語言和工具,
- 軟體工程師相對于程式員,除了需要掌握編碼技能外,還需要具備系統設計、需求分析、架構設計、專案管理等更高級的技能,
-
作業范圍:
- 程式員的作業范圍主要集中在具體的編碼實作和單個功能或模塊的開發上,
- 軟體工程師的作業范圍更廣,他們需要關注整個軟體專案的生命周期,并協調團隊成員之間的合作,
很多同學沉溺于技術,當然不是說技術不重要,技術很重要,筆者也同樣喜歡研究技術,但是編程往往在這個工程中只占一小部分,要當工程師還有很長一段路要走呢,整天CURD那只能證明終究還是程式員,那么可替代性當然就很強,可不就得35歲就請你走人換精力更旺盛的應屆生嘛
結論:嘗試著用工程化的思維作業
問題四:有沒有什么好的學習方法?
筆者也經常在網上看到某某幾步法,有些還吹得特別玄幻,背后經過美國XX專家研究,幫助多少人從一事無成到XX大咖,這些東西筆者以前參加作業前都嘗試過,基本沒啥用
這還是我之前提到的人心浮躁的問題,比較明顯的是很多同學沉迷于掙快錢,有些同學看似沒有想著掙快錢,希望通過自己的努力來獲取成果,這比前一種同學在思維上前進了一步,但是很多同學其實并沒有真正下功夫去啃書本,鉆研專案,很多同學學習盲目求快,幻想著一夜之間從學渣變成學霸,結果給自己制造焦慮,然后必然會去尋找怎么樣學習快,怎么樣學習高效,事實上在筆者看來,從你搜索開始,你就已經注定不可能學好了,因為你心亂了,這還是人心浮躁,只不過是一種比較隱蔽的人心浮躁罷了
學習本質事實上是個很單純的東西,把某樣東西反復重復,從不認識到認識,從認識到理解,理解到記住,記住到本能,如此而已,
所謂的高效辦法,那也只是基于你自己領悟以后總結出來的所謂的方法,不能一棒子打死所謂的學習方法都沒有用,但是你情緒浮躁,學也只是形似神不似,那只會邯鄲學步,讓你原本會的東西都忘了
如果硬要筆者介紹學習方法,那么筆者給大家推薦一個
例如我現在要學習:例如我現在要學習譚浩強的C語言程式設計,很多同學可能學習的時候力求把書上的東西還原出來,但事實上你要真有這本事有限的時間內一字不落地把書上的內容記下來,你現在就能當我的老師了,同學們要記住,書是人寫的,書上的所有知識體系都是基于寫書人的語言體系,但是人和人是不一樣的,有時候兩個人的生理結構命中注定相克,他的語言體系并不適合于你,那么你想學號這本書該怎么辦呢,用你自己的語言把書上的內容還原出來,這也是筆者之前在學習感悟里強調過的要建立自己的知識體系
這個時候就回到了那句老掉牙的話,適合自己的才是最好的
結論:大道至簡,追求那些花拳繡腿往往會變得不堪一擊,要更注重實在
附注
那么今天呢就先和大家聊到這里,筆者由于只作業了一年,加上筆者前半年由于經歷了數年的動蕩,渴望安定,基本上都處于一個半擺爛的狀態,所以能給大家分享的作業經驗也有限,筆者接下來會更加努力的作業,給大家帶來更多的經驗分享,希望同學們作業順利,早日升職加薪、當上總經理、出任CEO、迎娶白富美、走上人生巔峰,想想是不是還有點小激動呢
在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556954.html
標籤:其他
下一篇:返回列表
