小編在前陣子參加了 AWS 社群日,體驗了怎麼用英雄聯盟的資料來做模型的訓練和機器學習,並透過模型來為遊戲結果提供預測或建議。
對於 Python 菜鳥如我竟然可以在短短幾分鐘內使用 Jupyter Notebook 來探索和分析真實英雄聯盟對戰數據,當下覺得非常驚訝。
在這樣短暫的體驗下 AI 在過程中給了不少協助,舉個正在頻繁發生的例子來說,在 GPT 在跟 Chat 一起出現之後
接下來的下個時代,快速跟著世代變化做選擇似乎變得越來越需要。
在軟體工程領域,我們經常需要決定學習哪些新技術、參與哪些專案以及投入多少時間和精力,這些選擇將直接影響我們的職業生涯和生活。
這幾年的生活和工作發展下來,體驗到的是
工作和生活就是我們過去所做過的選擇的總和
當你重回當初的模樣,回頭過來看看曾經瘋狂、荒謬、驚奇、平靜、難忘的生活,最難遺忘的會是什麼。
工具的選擇來提兩種最可以直接有感增加開發者體驗的工具
在工作的選擇上我們可以分成三大類
人際關係和工作環境也可能會是有毒的,生活中其實最該選擇和斷捨離的會是人際關係,小時候常常聽到人脈,但其實多認識一個人其實不會真的多什麼資產。
充滿著追求更多,最終會不會就過著被被垃圾資訊、物質淹沒的生活。
底下是小編請 Chat GPT 列出的一些警訊
以程式碼撰寫來說,主要會有三種加速的目標
接下來的內容主要來翻譯 Double your react coding speed with this simple trick
這篇文章,會從剛剛提到的三個角度來切入 React 開發效率。
要讓打字時間縮短,大致上分為兩個方向:
DRY 增加共用的程式碼: 大元件拆分成小且可重用的 hooks 或元件
善用工具
通常找到錯誤的流程要先把 App 用開發模式跑起來後,操作元件重現錯誤並查看相關錯誤訊息,修復後重試。在開發階段如果要避免低階錯誤,可分成兩個方向
開發者最常花時間在看懂程式碼而非撰寫,通常好的程式都有容易被修改、容易發現問題的優點,那在撰寫上列出幾個我覺得需要改掉的壞習慣:
// 程式碼太多暗號
value[0][index] = sum;
// 滿滿的參數卻又未分類
<Grid
data={gridData}
pagination={false}
autoSize={true}
enableSort={true}
sortOrder="desc"
disableSelection={true}
infiniteScroll={true}
...
/>
const options = {
pagination: false,
autoSize: true,
enableSort: true,
sortOrder: 'desc',
disableSelection: true,
infiniteScroll: true,
...
}
<Grid
data={gridData}
options={options}
/>
// 太多布林值狀態
const [isLoading, setIsLoading] = useState(false)
const [isFinished, setIsFinished] = useState(false)
const [hasError, setHasError] = useState(false)
const fetchSomething = () => {
setIsLoading(true)
fetch(url)
.then(() => {
setIsLoading(false)
setIsFinished(true)
})
.catch(() => {
setHasError(true)
})
}
const [state, setState] = useState('idle')
const fetchSomething = () => {
setState('loading')
fetch(url)
.then(() => {
setState('finished')
})
.catch(() => {
setState('error')
})
}
元件優化的方向與過程,最主要還是拆解成可重複使用的小單位,像是運用 render props 或是 HOC 甚至是寫成 Custom hook,對岸維護的 ahook 功能就非常多樣。常見可以優化的部分我覺得分以下三個部分:
最開始的元件撰寫通常會長成下面這樣,在同樣一個元件裡面放了狀態,打 API 抓資料的相關程式,還有顯示的部分,好處當然就是直觀也不會說不好維護,但當這樣的元件有 50 個的時候,打 API 的方式要修改時,也許就會懷疑人生?
import React, { useEffect, useState } from "react";
import AddModal from "../components/AddModal";
import LoadingIndicator from "../components/LoadingIndicator";
import BrowserItem from "../components/BrowserItem";
import colors from "../config/colors";
function Browsers() {
const URL = "https://google.com/myData.json";
const [loading, setLoading] = useState(true);
const [browsers, setBrowsers] = useState([]);
const [modalVisible, setModalVisible] = useState(false);
const [description, setDescription] = useState("");
const changeDescription = (description) => {
setDescription(description);
setModalVisible(!modalVisible);
};
const changeOpacity = () => {
setModalVisible(!modalVisible);
};
useEffect(() => {
fetch(URL)
.then((response) => response.json())
.then((responseJson) => {
return responseJson.Browsers;
})
.then((browsers) => {
setBrowsers(browsers);
// console.log(browsers)
setLoading(false);
})
.catch((error) => {
console.log(error);
})
.finally(() => setLoading(false));
}, []);
return (
<>
{loading ? (
<LoadingIndicator />
) : (
<>
<AddModal
modalVisible={modalVisible}
changeOpacity={() => changeOpacity()}
description={description}
/>
<List
data={browsers}
keyExtractor={(browser) => browser.fullname}
renderItem={({ item }) => (
<BrowserItem
{...item}
changeDescription={() => changeDescription(item.description)}
/>
)}
/>
</>
)}
</>
);
}
export default Browsers;
將資料邏輯切割成更小可以重複使用的 hooks,當這些資料存取寫法被共用時就達到
import { useEffect, useState } from "react";
function useFetch(url) {
const [loading, setLoading] = useState(false);
const [data, setData] = useState(undefined);
useEffect(() => {
setLoading(true);
fetch(url)
.then((response) => response.json())
.then(setData)
.finally(() => setLoading(false))
.catch((error) => Alert.alert("Fetch error", error));
}, [url]);
return {
loading,
data,
};
}
function useBrowsers(url) {
const { loading, data } = useFetch(url);
const [selectedBrowser, setSelectedBrowser] = useState(undefined);
return {
loading,
browsers: data?.Browsers,
selectedBrowser,
setSelectedBrowser,
};
}
切割成更小可重用的元件且拿掉大部分的資料邏輯,僅留下 conditional render 的相關實作,元件行數下降找問題的速度肯定又更上層樓。
function UIFriendlyList(props) {
if (props.loading) {
return <LoadingIndicator />;
}
if (props?.data && props.data.length === 0) {
return <Text>This list is empty (</Text>;
}
return <List {...props} />;
}
// BrowsersList.tsx
function BrowsersList(props) {
const { loading, selectedBrowser, setSelectedBrowser, browsers } = props;
return (
<View style={styles.container}>
<AddModal
modalVisible={Boolean(selectedBrowser)}
onClose={() => setSelectedBrowser(undefined)}
description={selectedBrowser?.description}
/>
<UIFriendlyList
loading={loading}
data={browsers}
renderItem={({ item }) => (
<BrowserItem
key={item.fullname}
browser={item}
onPress={() => setSelectedBrowser(item)}
/>
)}
/>
</View>
);
}
function Browsers() {
return <BrowsersList {...useBrowsers("https://google.com/myData.json")} />;
}