أكثر الأخطاء شيوعًا عند المبرمجين المبتدئين لا علاقة كبيرة لها بقواعد اللغة. يتخطى المبرمج الجديد رسالة الخطأ، ويكتب خمسين سطرًا قبل أن يشغّل أيًا منها، ويتجاهل الحالة التي تكون فيها المدخلات غير صالحة، ويخمّن مكان الخلل بدلًا من أن ينظر إلى القيم الفعلية. هذه عادات، والعادات يمكن إصلاحها مبكرًا.
يتناول هذا المقال 13 منها. لكل واحد مثال قصير بلغة Go حيث يفيد الكود، ثم الحل. تصلح Go هنا لغةً للتعليم لأن مترجمها وأدواتها ترفض عددًا من هذه الأخطاء رفضًا قاطعًا. ويتناولها القسم القريب من نهاية المقال.
الخلاصة
- اقرأ رسالة الخطأ كاملة. فهي تخبرك بالملف والسطر وما الذي حدث.
- شغّل الكود كل بضعة أسطر. الخطوات الصغيرة تجعل العثور على الأخطاء سهلًا.
- لا تلصق كودًا لا تستطيع شرحه سطرًا سطرًا، بما في ذلك ما يولّده الذكاء الاصطناعي.
- تعامل مع مسار الخطأ. في Go، افحص كل
errقبل أن تستخدم القيمة التي أُعيدت معه. - سمِّ الأشياء بحسب ما تحمله، واجعل الدوال صغيرة، واختبر الحالات الفارغة والحدّية.
- استخدم Git من اليوم الأول، واحفظ الأسرار في متغيرات البيئة، واكتب اختبارًا قبل أن تظن أنك تحتاج إليه.
- صحّح الأخطاء بطباعة القيم أو بالتنقل خطوة خطوة عبر Delve، لا بتغيير الكود عشوائيًا.
- اجعل الكود يعمل قبل أن تجعله مجردًا أو سريعًا. ثم ابنِ شيئًا ليس درسًا تعليميًا.
جدول المحتويات
- 1. عدم قراءة رسالة الخطأ
- 2. كتابة كثير من الكود قبل تشغيل أي جزء منه
- 3. نسخ ولصق كود لا تستطيع شرحه
- 4. البرمجة للمسار السعيد فقط (happy path)
- 5. أسماء مبهمة
- 6. دالة واحدة ضخمة تفعل كل شيء
- 7. أخطاء الفرق بواحد (off-by-one) والمدخلات الفارغة
- 8. عدم استخدام نظام التحكم في الإصدارات من اليوم الأول
- 9. كتابة الإعدادات والأسرار مباشرة في الكود
- 10. عدم كتابة أي اختبار
- 11. التصحيح بالتخمين
- 12. التجريد أو التحسين قبل أن يعمل الكود
- 13. البقاء في الدروس التعليمية وطلب المساعدة دون مثال يعيد إنتاج المشكلة
- أي هذه الأخطاء تكتشفه Go نيابة عنك؟
1. عدم قراءة رسالة الخطأ
كثيرًا ما يرى المبتدئ نصًا أحمر فيعود مباشرة إلى الكود ليغيّر شيئًا ما. لكن رسالة الخطأ هي أنفع ما على الشاشة. فهي عادة تذكر الملف والسطر والعمود وما الذي حدث.
إليك أداة صغيرة تحمّل إعدادات خادم، وهي لا تُترجَم:
example.gogopackage main import ( "fmt" "os" ) func main() { port := os.Getenv("PORT") fmt.Println("starting server") }
example.texttext./main.go:9:2: declared and not used: port
اقرأها من اليسار إلى اليمين. main.go هو الملف، و9 هو السطر، و2 هو العمود، وبقية الرسالة تقول إن المتغير port لم يُستخدم أبدًا. إما أن تستخدمه أو تحذفه. لا شيء آخر خاطئ في البرنامج.
وينطبق الأمر نفسه على أخطاء وقت التشغيل. عندما يحدث panic في برنامج Go، يعرض تتبع المكدس (stack trace) الدالة والسطر اللذين وقع فيهما، ويبدأ بآخر استدعاء. ابحث عن أول سطر يشير إلى ملف من ملفاتك وابدأ منه.
إذا بدت لك رسائل الخطأ غامضة، فلست وحدك في ذلك. خلصت مجموعة عمل في مؤتمر ITiCSE راجعت الأبحاث عام 2019 إلى أن رسائل أخطاء المترجم «تمثل صعوبة كبيرة» للمبتدئين (Becker et al.، 2019). قراءتها ببطء وبمعناها الحرفي مهارة، وهي تتحسن بسرعة مع التمرين.
2. كتابة كثير من الكود قبل تشغيل أي جزء منه
قد يبدو من الكفاءة أن تكتب البرنامج كله ثم تشغّله لأول مرة، لكنها تجعل العثور على الأخطاء مكلفًا. عندما يفشل 80 سطرًا جديدًا، قد يكون الخطأ في أي مكان منها. وعندما تفشل 5 أسطر جديدة، فهو في هذه الخمسة.
الحل حلقة قصيرة. اكتب بضعة أسطر، وشغّلها، واقرأ المخرجات، ثم كرّر. اطبع القيم الوسيطة أثناء البناء، واحذف أوامر الطباعة بعد أن يعمل الجزء. تترجم Go بسرعة تكفي لأن يكلّفك go run . بعد كل تغيير صغير ثانية أو ثانيتين.
3. نسخ ولصق كود لا تستطيع شرحه
لا بأس بالنسخ من Stack Overflow أو من مساعد ذكاء اصطناعي. الخطأ هو لصق كود لا تستطيع شرحه. عندما يتعطل، وسيتعطل، لن تعرف من أين تبدأ. كما أنك تتخطى الجزء الذي تتعلم فيه.
ضع لنفسك قاعدة. قبل اللصق، اقرأ كل سطر وقل ما الذي يفعله. إن لم تستطع، فاطلب من الذكاء الاصطناعي أن يشرح ذلك السطر، أو أعد كتابته بنفسك انطلاقًا من الشرح. تزداد أهمية هذه القاعدة الآن بعد أن صار الذكاء الاصطناعي جزءًا من طريقة تعلم معظم الناس. من بين من يتعلمون البرمجة، يستخدم 73.3% أدوات الذكاء الاصطناعي أو يخططون لاستخدامها، ويستخدمها 39.5% كل يوم (Stack Overflow Developer Survey، 2025). تجد الحجة كاملة في هل ما زال عليك كتابة الكود بيدك.
4. البرمجة للمسار السعيد فقط (happy path)
يميل كود المبتدئين إلى افتراض أن الملف موجود، وأن الشبكة تعمل، وأن المستخدم كتب رقمًا. المدخلات الحقيقية أكثر فوضى. هذا البرنامج يقرأ رقم منفذ ويتجاهل الخطأ:
example.gogopackage main import ( "fmt" "strconv" ) func main() { input := "80a0" port, _ := strconv.Atoi(input) fmt.Println("listening on port", port) }
example.texttextlistening on port 0
تحوّل الخطأ المطبعي إلى المنفذ 0 دون أي تحذير. تعيد Go الأخطاء كقيم عادية، فالحل أن تفحصها وتذكر ما الذي فشل:
example.gogopackage main import ( "fmt" "os" "strconv" ) func parsePort(raw string) (int, error) { port, err := strconv.Atoi(raw) if err != nil { return 0, fmt.Errorf("invalid port %q: %w", raw, err) } if port < 1 || port > 65535 { return 0, fmt.Errorf("port %d out of range 1-65535", port) } return port, nil } func main() { port, err := parsePort("80a0") if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Println("listening on port", port) }
example.texttextinvalid port "80a0": strconv.Atoi: parsing "80a0": invalid syntax exit status 1
لكل مدخل، اسأل ماذا يحدث إذا كان مفقودًا أو فارغًا أو من نوع خاطئ أو كبيرًا جدًا. كل إجابة تصبح فحصًا في الكود.
5. أسماء مبهمة
الأسماء data وtmp وres وx2 وthing لا تخبر القارئ التالي بشيء، وبعد أسبوعين سيكون ذلك القارئ أنت. يجب أن يقول الاسم ما الذي تحمله القيمة، بمصطلحات المشكلة نفسها.
example.gogo// Hard to follow for _, d := range data { if d.s == 500 { tmp++ } } // Clear for _, req := range requests { if req.Status == 500 { serverErrors++ } }
العرف في Go أسماء قصيرة للنطاقات القصيرة وأسماء أطول للنطاقات الأوسع. i مقبول في حلقة من ثلاثة أسطر. أما متغير على مستوى الحزمة اسمه c فغير مقبول. وإذا وجدت صعوبة في تسمية شيء ما، فهذه غالبًا علامة على أنه يفعل أمرين.
6. دالة واحدة ضخمة تفعل كل شيء
دالة main من 200 سطر تقرأ ملفًا وتحلله وتحسب المجاميع وتطبع تقريرًا يصعب اختبارها ويصعب تغييرها أكثر. قسّمها بحسب المهمة. إليك أداة سطر أوامر صغيرة تعدّ رموز حالة HTTP في سجل الوصول (access log):
example.gogopackage main import ( "bufio" "fmt" "io" "maps" "os" "slices" "strings" ) func main() { if len(os.Args) != 2 { fmt.Fprintln(os.Stderr, "usage: logstats <access.log>") os.Exit(2) } f, err := os.Open(os.Args[1]) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer f.Close() counts, err := countStatusCodes(f) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } printReport(os.Stdout, counts) } // countStatusCodes reads access log lines and counts the status code, // which is the last field on each line. func countStatusCodes(r io.Reader) (map[string]int, error) { counts := make(map[string]int) sc := bufio.NewScanner(r) for sc.Scan() { fields := strings.Fields(sc.Text()) if len(fields) == 0 { continue } counts[fields[len(fields)-1]]++ } return counts, sc.Err() } func printReport(w io.Writer, counts map[string]int) { for _, code := range slices.Sorted(maps.Keys(counts)) { fmt.Fprintf(w, "%s %d\n", code, counts[code]) } }
example.texttext200 2 404 1 500 1
صارت main تربط الأجزاء ببعضها فقط. تستقبل countStatusCodes قيمة io.Reader بدلًا من اسم ملف، فيستطيع الاختبار أن يمرر إليها strings.Reader دون أن يلمس القرص. وتستقبل printReport قيمة io.Writer للسبب نفسه. كل دالة تتسع لشاشة واحدة وتفعل شيئًا واحدًا.
7. أخطاء الفرق بواحد (off-by-one) والمدخلات الفارغة
من الأخطاء المعروفة حلقة تتقدم خطوة أبعد من اللازم. هذه الحلقة تحلل صفًا من ملف CSV وتستخدم <= حيث تحتاج إلى <:
example.gogopackage main import ( "fmt" "strings" ) func main() { fields := strings.Split("alice,admin,active", ",") for i := 0; i <= len(fields); i++ { fmt.Println(fields[i]) } }
example.texttextalice admin active panic: runtime error: index out of range [3] with length 3 goroutine 1 [running]: main.main() /home/you/csvrow/main.go:11 +0xc0 exit status 2
يقول الـ panic بالضبط ما الذي حدث. استُخدم الفهرس 3 على slice طوله 3، وآخر فهرس صالح فيه هو 2، وذلك في السطر 11. في Go أبسط حل ألا تدير الفهرس بنفسك أصلًا: الحلقة for _, field := range fields لا يمكن أن تتجاوز النهاية.
وللخطأ نفسه قريب أهدأ هو المدخلات الفارغة. هذه الدالة تحسب متوسط زمن استجابة الطلبات:
example.gogopackage main import "fmt" func averageLatency(ms []float64) float64 { var total float64 for _, v := range ms { total += v } return total / float64(len(ms)) } func main() { fmt.Println(averageLatency([]float64{120, 80, 100})) fmt.Println(averageLatency(nil)) }
example.texttext100 NaN
غياب الطلبات يعني القسمة على صفر، وهذا يعطي NaN مع الأعداد العشرية وpanic مع الأعداد الصحيحة. اسأل دائمًا ماذا تفعل دالتك مع صفر عناصر، ومع عنصر واحد، ومع الحد الأقصى. هذه الحالات الثلاث تكشف كثيرًا من أخطاء الحدود.
8. عدم استخدام نظام التحكم في الإصدارات من اليوم الأول
يؤجل كثير من المبتدئين Git حتى يأتي مشروع «حقيقي». ثم يكسرون شيئًا كان يعمل قبل ساعة ولا يجدون طريقًا للعودة. Git هو زر التراجع لمشروعك كله، والبدء به لا يكلف شيئًا تقريبًا:
example.bashbashgit init git add . git commit -m "Parse port from PORT env var"
نفّذ commit في كل مرة يعمل فيها شيء ما، برسالة تقول ما الذي تغيّر. وعندما تكسر الكود، يعرض لك git diff ما غيّرته منذ آخر حالة سليمة. ادفع الكود إلى GitHub أو أي استضافة أخرى، فتحصل أيضًا على نسخة احتياطية وعلى معرض لأعمالك.
9. كتابة الإعدادات والأسرار مباشرة في الكود
وضع كلمة مرور قاعدة البيانات أو مفتاح API مباشرة في الكود المصدري ينجح إلى أن تدفعه إلى مستودع عام. أحصت GitGuardian في عام 2025 نحو 28.65 مليون سر جديد مكتوب مباشرة في الكود أُضيف إلى commits عامة على GitHub، بزيادة 34% عن العام السابق (GitGuardian، 2026). كما أن المنافذ والعناوين وبيانات الاعتماد تختلف بين حاسوبك وبيئة الإنتاج، فكتابتها في الكود تعني أن تعدّل الكود لكي تنشر.
اقرأها من البيئة بدلًا من ذلك:
example.gogopackage main import ( "cmp" "fmt" "os" ) func main() { addr := ":" + cmp.Or(os.Getenv("PORT"), "8080") apiKey := os.Getenv("PAYMENTS_API_KEY") if apiKey == "" { fmt.Fprintln(os.Stderr, "PAYMENTS_API_KEY is not set") os.Exit(1) } fmt.Println("listening on", addr) }
تعيد cmp.Or أول قيمة غير فارغة، فيحصل PORT على قيمة افتراضية معقولة. أما مفتاح API فلا قيمة افتراضية له، ويرفض البرنامج أن يبدأ دونه. وإذا كنت تحفظ القيم المحلية في ملف .env، فأضفه إلى .gitignore قبل أول commit.
10. عدم كتابة أي اختبار
يختبر المبتدئون برامجهم بتشغيلها والنظر إلى المخرجات. هذا ينجح مرة واحدة. لكنه لا يخبرك عندما يكسر تغيير لاحق شيئًا كان يعمل. تأتي Go مع أدوات الاختبار ضمن سلسلة أدواتها القياسية، فلا شيء تحتاج إلى تثبيته. أولًا، أصلح averageLatency من الخطأ 7 لكي تخبرك إن كانت هناك بيانات أصلًا:
example.gogofunc averageLatency(ms []float64) (float64, bool) { if len(ms) == 0 { return 0, false } var total float64 for _, v := range ms { total += v } return total / float64(len(ms)), true }
ثم أضف بجانبها اختبارًا جدوليًا (table test):
example.gogofunc TestAverageLatency(t *testing.T) { tests := []struct { name string in []float64 want float64 wantOK bool }{ {"three requests", []float64{120, 80, 100}, 100, true}, {"one request", []float64{42}, 42, true}, {"no requests", nil, 0, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, ok := averageLatency(tt.in) if got != tt.want || ok != tt.wantOK { t.Errorf("averageLatency(%v) = %v, %v, want %v, %v", tt.in, got, ok, tt.want, tt.wantOK) } }) } }
example.texttext--- PASS: TestAverageLatency (0.00s) --- PASS: TestAverageLatency/three_requests (0.00s) --- PASS: TestAverageLatency/one_request (0.00s) --- PASS: TestAverageLatency/no_requests (0.00s) PASS
ضعه في ملف ينتهي بـ _test.go وشغّل go test ./.... كل صف حالة واحدة، فإضافة حالة حدّية جديدة لا تتطلب أكثر من سطر إضافي. الصف no requests هو المدخل الذي أعاد NaN في الخطأ 7. صار له الآن جواب محدد واختبار يحافظ عليه.
11. التصحيح بالتخمين
تسير حلقة التصحيح عند المبتدئين هكذا: تغيّر شيئًا، وتشغّل البرنامج، فيبقى معطلًا، فتغيّر شيئًا آخر. بعد عشر جولات يمتلئ الكود بأخطاء جديدة ويبقى الخطأ الأصلي في مكانه. في دراسة شملت 21 طالبًا من سبع جامعات، كان بعضهم «يستخدم استراتيجيات قليلة ويطبقها بشكل غير فعّال»، وأدخلوا أخطاء جديدة أثناء التصحيح (Murphy et al.، 2008).
انظر قبل أن تغيّر. كوّن تخمينًا عن سبب المشكلة، ثم تحقق منه بطباعة القيم الفعلية:
example.gogolog.Printf("order=%+v total=%d items=%d", order, total, len(order.Items))
يطبع %+v أسماء حقول الـ struct، فلا تحتاج إلى تخمين أي رقم يخص أي حقل. وعندما تصبح أوامر الطباعة مزعجة، استخدم مصحح أخطاء (debugger). Delve هو المصحح القياسي في Go، ويعتمد عليه كل من VS Code وGoLand في الخلفية:
example.bashbashdlv debug . -- access.log (dlv) break main.go:43 (dlv) continue (dlv) print fields []string len: 3, cap: 3, [ "GET", "/api/orders", "200", ]
السطر 43 هو سطر counts[...]++ في أداة عدّ السجلات من الخطأ 6. يتوقف البرنامج عنده، فتفحص القيمة الحقيقية لـ fields بدلًا من تخمينها.
عندما تجد الخطأ، اكتب اختبارًا يعيد إنتاجه قبل أن تصلحه. بهذا لا يمكن أن يعود بصمت.
12. التجريد أو التحسين قبل أن يعمل الكود
من المغري أن تصمم واجهات وأنظمة إعدادات وطبقات إضافات لبرنامج لا يعمل بعد. أو أن تستبدل بحلقة واضحة شيئًا ذكيًا لأنه قد يكون أسرع. كلا الأمرين يجعل الكود أصعب في التغيير قبل أن تعرف ما الذي يجب أن يفعله.
اجعله يعمل بأبسط كود تستطيع كتابته. انتظر حتى تكتب الشيء نفسه ثلاث مرات قبل أن تنقله إلى دالة مشتركة. في Go، عرّف interface عندما يظهر تنفيذ ثانٍ فعلًا، لا عندما تتخيله. ولا تحسّن الأداء إلا بعد أن تقيسه، وGo تعطيك الأدوات لذلك: go test -bench لقياس الأداء وpprof لتحليله.
13. البقاء في الدروس التعليمية وطلب المساعدة دون مثال يعيد إنتاج المشكلة
تشعرك الدروس التعليمية بالإنتاجية لأن كل خطوة فيها تنجح. وأول مرة تفتح فيها ملفًا فارغًا، تكتشف كم بقي في ذهنك فعلًا. في مرحلة ما عليك أن تبني شيئًا لم يرشدك إليه أحد: أداة سطر أوامر تعيد تسمية الملفات، أو واجهة HTTP API صغيرة، أو بوتًا لتطبيق محادثة. سيكون فوضويًا، وستتعلم منه أكثر مما ستتعلمه من الدروس الثلاثة التالية. يشرح مقال كيف تتعلم البرمجة في 2026 كيف تنظم هذا التمرين، ويعرض مقال كيف تتعلم Go خطة كاملة لتعلم Go.
عندما تعلق ستطلب المساعدة، وطريقة طلبك مهمة. عبارة «الكود لا يعمل» لن تفيدك بشيء. اختصر المشكلة إلى أصغر برنامج ما زال يُظهر الخطأ، ثم شارك ذلك البرنامج ومخرجات الخطأ كما هي وما كنت تتوقعه وما جربته. كثيرًا ما ستجد الخطأ بنفسك أثناء الاختصار. في Go، يعطيك Go Playground رابطًا قابلًا للمشاركة لبرنامج قابل للتشغيل.
أي هذه الأخطاء تكتشفه Go نيابة عنك؟
صُممت Go لقواعد كود كبيرة يصونها كثير من الناس، وعدد من قواعدها يمنع أخطاء المبتدئين قبل أن يعمل الكود.
- المتغيرات والاستيرادات غير المستخدمة لا تُترجَم. يرفض المترجم
declared and not usedو"strings" imported and not used. يصف Go FAQ هذا بأنه «مقايضة الراحة قصيرة المدى بسرعة البناء ووضوح البرنامج على المدى الطويل»، ويشير إلى أن المتغير غير المستخدم قد يدل على خطأ. - تنسّق
gofmtكل ملفات Go بالطريقة نفسها، فلا تتجادل أبدًا حول المسافات أو موضع الأقواس، ولا تستطيع المسافات البادئة الفوضوية أن تخفي خطأ (gofmt). - يكتشف
go vetالكود المريب. فهو ينبّه إلى أشياء مثل تمرير سلسلة نصية إلى الرمز%d، وهذا يُترجَم دون مشكلة لكنه يطبع نتيجة لا معنى لها (cmd/vet). - الأخطاء قيم يجب أن تتعامل معها. الدالة التي قد تفشل تعيد قيمة من نوع
error. وعندما تعيد قيمة وخطأ معًا، لا يمكنك استخدام القيمة دون أن تستقبل الخطأ أيضًا، حتى لو تخلصت منه بعد ذلك بـ_ظاهرة. خطأ المسار السعيد من القسم 4 يصبح شيئًا عليك أن تكتبه عن قصد (Errors are values). - الاختبار مدمج في اللغة. يأتي
go testوالحزمةtestingمع Go، فلا يوجد إطار عمل عليك اختياره قبل أول اختبار (testing). - كاشف السباقات (race detector) يعثر على سباقات البيانات. شغّل الاختبارات أو البرامج مع
-race، فتبلغك Go عن الوصول المتزامن إلى الذاكرة المشتركة مع الملف والسطر لكلا الوصولين (Data Race Detector).
إليك go vet وهو يكتشف خطأ تنسيق يُترجَم دون مشكلة:
example.gogopackage main import "fmt" func main() { active := "12" fmt.Printf("%d active users\n", active) }
example.texttext./main.go:7:14: fmt.Printf format %d has arg active of wrong type string
لن تمنعك Go من كتابة دالة من 200 سطر أو من تسمية متغير tmp. لكنها تكتشف الأخطاء الآلية، فيبقى لك وقت أكبر للأخطاء التي تحتاج إلى حسن تقدير. ولفخاخ خاصة بـ Go مثل الأخطاء المظللة أو مفاجآت append، راجع أخطاء Go الشائعة التي يجب تجنبها.
الأسئلة الشائعة
ما أكثر خطأ يقع فيه المبرمجون المبتدئون؟
في أكبر دراسة لأخطاء الترجمة عند المبتدئين، والتي شملت 37 مليون عملية ترجمة لأكثر من 250,000 طالب يتعلمون Java، كان الخطأ الأكثر تكرارًا هو الأقواس أو علامات الاقتباس غير المتطابقة. وكانت هذه تُصلح بسرعة. أما الأخطاء المكلفة فهي التي لم ينبّه إليها المترجم، مثل تجاهل قيمة معادة، إذ كان إصلاحها يستغرق عادة أكثر من 17 دقيقة أو لا تُصلح أبدًا (Altadmri & Brown، 2015). وعلى مستوى العادات، عدم قراءة رسالة الخطأ هو ما يبطئ كل شيء آخر.
كيف أتوقف عن تكرار الأخطاء البرمجية نفسها؟
اكتب اختبارًا لكل خطأ تصلحه، حتى لا يعود دون أن تلاحظ. واحتفظ بقائمة قصيرة بالأخطاء التي وقعت فيها أكثر من مرة، وراجع كودك على ضوئها قبل كل commit. الأدوات تساعد أيضًا. في Go، يكتشف go vet وgofmt فئة من الأخطاء تلقائيًا.
هل Go لغة جيدة للمبتدئين الذين يقعون في أخطاء كثيرة؟
نعم. يرفض مترجم Go المتغيرات والاستيرادات غير المستخدمة، وأخطاؤه قيم معادة صريحة، وتأتي go vet وgofmt وgo test مع اللغة. ورسائل الأخطاء فيها قصيرة وتشير إلى ملف وسطر. راجع هل Go لغة برمجة أولى جيدة للمقارنة الكاملة.
هل ينبغي للمبتدئين استخدام الذكاء الاصطناعي لكتابة الكود؟
استخدمه لشرح الكود والأخطاء والمفاهيم، لا لكتابة كود لا تستطيع متابعته. من القواعد الجيدة ألا تلصق أبدًا كودًا لا تستطيع إعادة كتابته من الذاكرة في اليوم التالي. ستحتاج إلى هذا الفهم لإصلاح كود الذكاء الاصطناعي عندما يكون صحيحًا تقريبًا.
كم يستغرق التخلص من أخطاء المبتدئين؟
عند معظم الناس تتلاشى هذه العادات بعد بضعة أشهر من كتابة الكود بانتظام، لأن كل واحدة منها تكلفك وقتًا حتى تصلحها. التمرين اليومي على برامج حقيقية يوصلك إلى هناك أسرع من الجلسات الطويلة المتباعدة. الأخطاء الآلية تختفي أولًا. أما المسائل التي تحتاج إلى حسن تقدير، مثل التسمية وحجم الدوال، فتستغرق وقتًا أطول.
ابدأ كتابة Go اليوم
كل خطأ في هذه القائمة يصبح تجنبه أسهل كلما كتبت كودًا أكثر ورأيت ما الخطأ بسرعة أكبر. هذه هي الفكرة وراء LevelUpGo. كل درس تمرين Go يعمل على سلسلة أدوات Go حقيقية في المتصفح، فمن يومك الأول تقرأ أخطاء المترجم الفعلية، وتتعامل مع قيم err، وترى الاختبارات وهي تفشل. ابدأ بمسار Go Fundamentals.
