ولې لاړ د غیر سمارټ پروګرام کونکو لپاره بد دی

مقاله د مخکیني خپاره شوي ځواب په توګه لیکل شوې وه antipodean ماده.

ولې لاړ د غیر سمارټ پروګرام کونکو لپاره بد دی

په تیرو دوه کلونو کې زه د پرمختللي بیلینګ سیسټم سره د ځانګړي RADIUS سرور پلي کولو لپاره Go کاروم. د لارې په اوږدو کې، زه پخپله د ژبې پیچلتیاوې زده کوم. برنامه پخپله خورا ساده دي او د دې مقالې هدف نه دی ، مګر پخپله د Go کارولو تجربه د دې په دفاع کې د یو څو ټکو مستحق ده. Go د جدي، د توزیع وړ کوډ لپاره په زیاتیدونکي توګه د اصلي جریان ژبه کیږي. ژبه د ګوګل لخوا جوړه شوې، چیرې چې دا په فعاله توګه کارول کیږي. لاندینۍ کرښه، زه په صادقانه توګه فکر کوم چې د ګو ژبې ډیزاین د غیر شعوري پروګرام کونکو لپاره خراب دی.

د ضعیف پروګرامرانو لپاره ډیزاین شوی؟

کمزوري د ستونزو خبرې کوي. د نظرونو او خوبونو په اړه قوي خبرې ...

Go زده کول خورا اسانه دي ، دومره اسانه چې تاسو کولی شئ په حقیقت کې هیڅ روزنې پرته کوډ ولولئ. د ژبې دا ځانګړتیا په ډیری نړیوالو شرکتونو کې کارول کیږي کله چې کوډ د غیر اصلي متخصصینو (مدیرانو، پیرودونکو، او نورو) سره یوځای لوستل کیږي. دا د ډیزاین چلولو پراختیا په څیر میتودولوژیو لپاره خورا اسانه دی.
حتی نوي پروګرام کونکي د یوې یا دوه اونیو وروسته خورا ښه کوډ تولید پیل کوي. هغه کتاب چې ما مطالعه کړی د "ګو پروګرامینګ" دی (د مارک سمرفیلډ لخوا). کتاب خورا ښه دی، دا د ژبې ډیری لنډیزونه په ګوته کوي. د غیر ضروري پیچلو ژبو لکه جاوا، پی ایچ پی وروسته، د جادو نشتوالی تازه دی. مګر ژر یا وروسته، ډیری محدود پروګرام کونکي په نوي ساحه کې د پخوانیو میتودونو کارولو مفکوره لري. ایا دا واقعیا اړین دی؟

Rob Pike (د ژبې اصلي مفکوره) د Go ژبه د یوې صنعتي ژبې په توګه رامینځته کړه چې د پوهیدو لپاره اسانه او کارول یې اغیزمن دي. ژبه په لویو ټیمونو کې د اعظمي تولید لپاره ډیزاین شوې او پدې کې هیڅ شک نشته. ډیری نوي پروګرام کونکي شکایت کوي چې ډیری ځانګړتیاوې شتون لري چې دوی یې ورک دي. د سادګۍ لپاره دا هیله د ژبې د ډیزاینرانو لخوا یوه شعوري پریکړه وه، او د دې لپاره چې په بشپړه توګه پوه شي چې ولې ورته اړتیا وه، موږ باید د پراختیا کونکو هڅونې او هغه څه پوه شو چې دوی یې د ترلاسه کولو هڅه کوله.

نو ولې دومره ساده جوړ شو؟ دلته د روب پایک څخه یو څو نرخونه دي:

دلته مهم ټکی دا دی چې زموږ پروګرام کونکي څیړونکي ندي. دوی، د یوې قاعدې په توګه، خورا ځوان دي، موږ ته د مطالعې وروسته راځي، شاید دوی جاوا، یا C/C++، یا Python مطالعه کړي. دوی په عالي ژبه نه پوهیږي، مګر په ورته وخت کې موږ غواړو چې دوی ښه سافټویر جوړ کړي. له همدې امله ژبه باید د پوهیدو او زده کولو لپاره اسانه وي.

هغه باید آشنا وي، تقریبا د C سره ورته خبرې کوي. هغه پروګرام کونکي چې په ګوګل کې کار کوي خپل کیریر ژر پیل کوي او ډیری یې د طرزالعمل ژبو سره بلد دي، په ځانګړې توګه د C کورنۍ. په نوې برنامه ژبه کې د ګړندي تولید اړتیا پدې معنی ده چې ژبه باید خورا افراطي نه وي.

هوښيار کلمې، نه دي؟

د سادګۍ اثار

سادگي د ښکلا لپاره یو اړین شرط دی. لیو تولستوی

د دې ساده ساتل په هر ډیزاین کې یو له خورا مهم اهدافو څخه دی. لکه څنګه چې تاسو پوهیږئ، یوه بشپړه پروژه هغه پروژه نه ده چیرې چې د اضافه کولو لپاره هیڅ شی شتون نلري، مګر یو له هغې څخه د لرې کولو لپاره هیڅ شی شتون نلري. ډیری خلک پدې باور دي چې د پیچلو ستونزو د حل (یا حتی څرګندولو) لپاره، پیچلې وسیله ته اړتیا ده. په هرصورت، دا نه ده. راځئ چې د مثال په توګه د PERL ژبه واخلو. د ژبې ایډیالوژستان په دې باور وو چې یو پروګرامر باید د یوې ستونزې د حل لپاره لږترلږه درې مختلفې لارې ولري. د ګو ژبې ایډیالوژستانو بله لاره غوره کړه؛ دوی پریکړه وکړه چې یوه لاره، مګر واقعیا ښه، هدف ته د رسیدو لپاره کافي ده. دا طریقه یو جدي بنسټ لري: یوازینۍ لار د زده کړې اسانه او هیرول سخت دي.

ډیری مهاجرین شکایت کوي چې ژبه په زړه پورې لنډیزونه نلري. هو، دا ریښتیا ده، مګر دا د ژبې یو له مهمو ګټو څخه دی. ژبه لږترلږه جادو لري - نو د برنامې لوستلو لپاره ژورې پوهې ته اړتیا نشته. لکه څنګه چې د کوډ فعلیت لپاره، دا هیڅ ستونزه نده. د ګولنګ یو ښه لیکل شوی پروګرام په عمودی توګه لوستل کیږي، د لږ یا هیڅ جوړښت سره. برسېره پردې، د برنامه لوستلو سرعت لږترلږه د هغې د لیکلو سرعت څخه لوی مقدار دی. که تاسو په پام کې ونیسئ چې ټول کوډ یونیفورم فارمیټ لري (د جوړ شوي gofmt کمانډ په کارولو سره ترسره شوی) ، نو د یو څو اضافي لینونو لوستل هیڅ ستونزه نده.

ډیر څرګند نه دی

هنر هغه وخت نه زغمي چې ازادي یې محدوده وي. دقت د هغه مسؤلیت نه دی.

د سادګۍ د لیوالتیا له امله، Go د داسې جوړښتونو نشتوالی دی چې په نورو ژبو کې د هغو خلکو لخوا د طبیعي شی په توګه پیژندل کیږي چې د دوی سره عادت شوي دي. په لومړي سر کې دا ممکن یو څه ناامنه وي، مګر بیا تاسو ګورئ چې برنامه د لوستلو لپاره خورا اسانه او ډیر مبهم دی.

د مثال په توګه ، د کنسول یوټیلیټ چې stdin لوستل کوي یا د کمانډ لاین دلیلونو څخه فایل به داسې ښکاري:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()

    scanner := newScanner(flag.Args())

    var text string
    for scanner.Scan() {
        text += scanner.Text()
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

func newScanner(flags []string) *bufio.Scanner {
    if len(flags) == 0 {
        return bufio.NewScanner(os.Stdin)
    }

    file, err := os.Open(flags[0])

    if err != nil {
        log.Fatal(err)
    }

    return bufio.NewScanner(file)
}

په D کې د ورته ستونزې حل، که څه هم دا یو څه لنډ ښکاري، لوستل یې اسانه ندي

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

د کاپي کولو دوزخ

انسان په خپل ځان کې دوزخ ګرځوي. مارتین لوتر.

پیل کونکي په دوامداره توګه د جنریک نشتوالي له امله د Go په اړه شکایت کوي. د دې مسلې حل کولو لپاره، ډیری یې د مستقیم کوډ کاپي کاروي. د مثال په توګه، د انټیجرونو لیست لنډولو لپاره یو فنکشن، دا ډول مسلکیان پدې باور دي چې فعالیت د هر ډیټا ډول لپاره د ساده کاپي پیسټ کولو پرته په بل ډول نشي پلي کیدی.

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

ژبه د داسې جوړښتونو د پلي کولو لپاره کافي وسیله لري. د مثال په توګه، عمومي پروګرامونه به ښه وي.

package main

import "fmt"

func Eval32(list []int32, fn func(a, b int32)int32) int32 {
    var res int32
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int32Add(a, b int32) int32 {
    return a + b
}

func int32Sub(a, b int32) int32 {
    return a + b
}

func Eval64(list []int64, fn func(a, b int64)int64) int64 {
    var res int64
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int64Add(a, b int64) int64 {
    return a + b
}

func int64Sub(a, b int64) int64 {
    return a - b
}

func main() {

    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(Eval32(list32, int32Add))
    fmt.Println(Eval64(list64, int64Add))
    fmt.Println(Eval64(list64, int64Sub))
}

او، که څه هم زموږ کوډ د تیرې قضیې په پرتله یو څه اوږد و، دا عمومي شوی. له همدې امله، دا به زموږ لپاره ستونزمن نه وي چې ټول ریاضي عملیات پلي کړو.

ډیری به ووایی چې په D کې یو برنامه خورا لنډ ښکاري، او دوی به سم وي.

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

په هرصورت، دا یوازې لنډ دی، مګر ډیر سم نه دی، ځکه چې د D تطبیق په بشپړه توګه د غلطۍ اداره کولو ستونزه له پامه غورځوي.

په ریښتیني ژوند کې، لکه څنګه چې د منطق پیچلتیا زیاتیږي، خلا په چټکۍ سره کمیږي. خلا نوره هم په چټکۍ سره تړل کیږي کله چې تاسو اړتیا لرئ یو عمل ترسره کړئ چې د معیاري ژبې آپریټرونو په کارولو سره نشي ترسره کیدی.

د ساتلو ، توسعیت او لوستلو شرایطو کې ، زما په نظر ، د Go ژبه ګټل کیږي ، که څه هم دا په لفظي ډول له لاسه ورکوي.

په ځینو مواردو کې عمومي پروګرامونه موږ ته د نه منلو وړ ګټې راکوي. دا په واضح ډول د ترتیب کڅوړې لخوا ښودل شوي. نو، د هر لیست ترتیب کولو لپاره، موږ یوازې د sort.Interface انٹرفیس پلي کولو ته اړتیا لرو.

import "sort"

type Names []string

func (ns Names) Len() int {
    return len(ns)
}

func (ns Names) Less(i, j int) bool {
    return ns[i] < ns[j]
}

func (ns Names) Swap(i, j int) {
    ns[i], ns[j] = ns[j], ns[i]
}

func main() {
    names := Names{"London", "Berlin", "Rim"}
    sort.Sort(names)
}

که تاسو د خلاصې سرچینې پروژه واخلئ او د grep "interface{}" -R کمانډ پرمخ وړئ، تاسو به وګورئ چې څومره مغشوشونکي انٹرفیسونه کارول کیږي. نږدې ذهن لرونکي ملګري به سمدلاسه ووايي چې دا ټول د عمومي نشتوالي له امله دي. په هرصورت، دا تل قضیه نه ده. راځئ چې د مثال په توګه DELPHI واخلو. د دې ورته جنریکونو شتون سره سره، دا د خپل سري ډیټا ډولونو سره د عملیاتو لپاره یو ځانګړی VARIANT ډول لري. د Go ژبه هم همداسې کوي.

له توپ څخه تر مرغانو پورې

او سټریټ جیکټ باید د جنون اندازې سره سمون ولري. Stanislav Lec.

ډیری سخت مینه وال ممکن ادعا وکړي چې Go د جنریکونو رامینځته کولو لپاره بل میکانیزم لري - انعکاس. او دوی به سم وي ... مګر یوازې په نادره مواردو کې.

روب پیک موږ ته خبرداری ورکوي:

دا یو پیاوړی وسیله ده چې باید په احتیاط سره وکارول شي. دا باید مخنیوی وشي پرته لدې چې په کلکه اړتیا وي.

ويکيپېډيا موږ ته لاندې وايي:

انعکاس هغه پروسې ته اشاره کوي چې په جریان کې یو برنامه کولی شي د اجرا کولو پرمهال خپل جوړښت او چلند وڅاري او بدل کړي. د انعکاس لاندې پروګرام کولو تمثیل د انعکاس برنامې په نوم یادیږي. دا د میټاپروګرام کولو یو ډول دی.

په هرصورت، لکه څنګه چې تاسو پوهیږئ، تاسو باید د هرڅه لپاره پیسې ورکړئ. په دې حالت کې دا دی:

  • د برنامو لیکلو کې مشکل
  • د پروګرام اجرا سرعت

له همدې امله، انعکاس باید په احتیاط سره وکارول شي، لکه د لوی کیلیبر وسلې. د انعکاس بې فکره کارول د نه لوستلو برنامو ، دوامداره غلطیو او ټیټ سرعت لامل کیږي. د سنوب پروګرامر لپاره یوازې شی د دې وړتیا لري چې خپل کوډ د نورو ، ډیر عملي او معتدل همکارانو په وړاندې وښیې.

د شي څخه کلتوري سامان؟ نه، د څو ژبو څخه!

د قسمت تر څنګ پورونه هم وارثانو ته پاتې دي.

د دې حقیقت سره سره چې ډیری باور لري چې ژبه په بشپړ ډول د C میراث پر بنسټ والړ ده، دا قضیه نده. ژبه د غوره پروګرامینګ ژبو ډیری اړخونه شاملوي.

العروض

تر ټولو لومړی، د ګرامري جوړښتونو ترکیب د C ژبې د نحو پر بنسټ والړ دی. په هرصورت، د ډیلفي ژبه هم د پام وړ اغیزه درلوده. پدې توګه ، موږ ګورو چې بې کاره قوسونه ، کوم چې د برنامې لوستلو وړتیا خورا کموي ، په بشپړ ډول لرې شوي. په ژبه کې ":=" چلونکی هم شامل دی چې د DELPHI ژبې سره تړاو لري. د کڅوړو مفهوم د ADA په څیر ژبو څخه پور اخیستل شوی. د غیر استعمال شوي ادارو اعالمیه د PROLOG ژبې څخه پور اخیستل کیږي.

سیمانټیک

کڅوړې د ډیلفي ژبې د سیمانټیک پراساس وې. هر بسته ډیټا او کوډ پوښي او خصوصي او عامه ادارې لري. دا تاسو ته اجازه درکوي د بسته انٹرفیس لږترلږه ته راټیټ کړئ.

د پلې کولو عملیات د پلاوي له طریقې څخه د ډیلفي ژبې څخه اخیستل شوي.

تالیف

دا پرته له دلیل څخه ندي چې ټوکه شتون لري: Go رامینځته شوی و پداسې حال کې چې د C برنامه ترتیب شوې وه. د ژبې یو ځواک د هغې خورا چټک تالیف دی. دا نظر د DELPHI ژبې څخه اخیستل شوی. د Go هر کڅوړه د DELPHI ماډل سره مطابقت لري. دا کڅوړې یوازې هغه وخت بیا تنظیم شوي کله چې واقعیا اړین وي. له همدې امله ، د راتلونکي ترمیم وروسته ، تاسو اړتیا نلرئ ټول برنامه تالیف کړئ ، بلکه یوازې هغه بدل شوي کڅوړې او کڅوړې بیا تنظیم کړئ چې پدې بدل شوي کڅوړو پورې اړه لري (او حتی بیا ، یوازې که چیرې د بسته انٹرفیس بدل شوی وي).

د لوړې کچې ساختمانونه

ژبه ډیری بیلابیلې لوړې کچې جوړښتونه لري چې په هیڅ ډول د ټیټې کچې ژبې سره تړاو نلري لکه C.

  • تارونه
  • د هش میزونه
  • ټوټې
  • د بت ټایپ کول د RUBY په څیر ژبو څخه پور اخیستل شوي (کوم چې له بده مرغه ډیری یې نه پوهیږي یا د دې بشپړ ظرفیت څخه کار اخلي).

د حافظې مدیریت

د حافظې مدیریت عموما د جلا مقالې مستحق دی. که چیرې د C++ په څیر ژبو کې، کنټرول په بشپړه توګه پرمخ وړونکي ته پریښودل شي، نو بیا وروسته په ژبو لکه DELPHI کې، د حوالې شمیرنې ماډل کارول کیده. د دې طریقې سره، سایکلیک حوالې ته اجازه نه وه ورکړل شوې، ځکه چې د یتیم کلسترونه جوړ شوي، نو بیا Go د داسې کلسترونو (لکه C#) کشف کړي. سربیره پردې ، د کثافاتو راټولونکی د ډیری اوسني پیژندل شوي پلي کونکو څخه ډیر موثر دی او دمخه د ډیری ریښتیني وخت کارونو لپاره کارول کیدی شي. ژبه پخپله هغه حالتونه پیژني کله چې د متغیر ذخیره کولو ارزښت په سټیک کې تخصیص کیدی شي. دا د حافظې مدیر باندې بار کموي او د برنامه سرعت زیاتوي.

همغږي او همغږي

د ژبې موازيتوب او سیالي د ستاینې څخه بهر ده. هیڅ د ټیټې کچې ژبه حتی د Go سره سیالي نشي کولی. د عادلانه کیدو لپاره، دا د یادولو وړ ده چې ماډل د ژبې لیکوالانو لخوا نه دی اختراع شوی، مګر په ساده ډول د ښه زوړ ADA ژبې څخه پور اخیستل شوی. ژبه د ټولو CPUs په کارولو سره د ملیونونو موازي ارتباطاتو پروسس کولو وړتیا لري ، پداسې حال کې چې د ډیډ لاک او ریس شرایطو سره د اندازې لږ پیچلي ستونزې لري چې د څو تاریډ کوډ لپاره ځانګړي دي.

اضافي ګټې

که دا ګټور وي، هرڅوک به بې رحمه شي.

ژبه موږ ته یو شمیر بې شکه ګټې هم راکوي:

  • د پروژې له جوړولو وروسته یو واحد اجرا وړ فایل د غوښتنلیکونو پلي کول خورا ساده کوي.
  • جامد ټایپ کول او د ډول تحلیل کولی شي ستاسو په کوډ کې د غلطیو شمیر د پام وړ کم کړي ، حتی د ازموینې لیکلو پرته. زه ځینې برنامه پیژنم چې پرته له ازموینې لیکلو پرته ترسره کوي او د دوی کوډ کیفیت د پام وړ زیان نه لري.
  • خورا ساده کراس تالیف او د معیاري کتابتون عالي پورټ وړتیا ، کوم چې د کراس پلیټ فارم غوښتنلیکونو پراختیا خورا ساده کوي.
  • د RE2 منظم څرګندونې د تار څخه خوندي دي او د وړاندوینې وړ اجرا کولو وختونه لري.
  • یو پیاوړی معیاري کتابتون چې ډیری پروژې د دریمې ډلې چوکاټونو پرته ترسره کولو ته اجازه ورکوي.
  • ژبه دومره ځواکمنه ده چې د ستونزې د حل کولو پرځای تمرکز وکړي، مګر بیا هم دومره ټیټه کچه چې ستونزه په اغیزمنه توګه حل کیدی شي.
  • د ګو ایکو سیسټم دمخه د ټولو فرصتونو لپاره د بکس څخه بهر پرمختللي وسیلې لري: ازموینې ، اسناد ، د بسته بندۍ مدیریت ، ځواکمن لینټرې ، د کوډ تولید ، د ریس شرایط کشف کونکی ، او داسې نور.
  • د ګو نسخه 1.11 د سیمانټیک انحصار مدیریت جوړ شوی معرفي کړ ، چې د مشهور VCS کوربه توب په سر کې جوړ شوی. ټول هغه وسیلې چې د Go ایکوسیستم رامینځته کوي دا خدمتونه د دوی څخه د کوډ ډاونلوډ ، جوړولو او نصبولو لپاره کاروي په یوه ناڅاپي ډول. او دا ډیر ښه دی. د 1.11 نسخې په راتګ سره، د بسته بندي نسخه کولو ستونزه هم په بشپړه توګه حل شوه.
  • ځکه چې د ژبې اصلي مفکوره د جادو کمول دي، ژبه پراختیا ورکوونکي هڅوي چې په ښکاره توګه د تېروتنې اداره کړي. او دا سمه ده، ځکه چې که نه نو، دا به په ساده ډول د غلطۍ اداره کولو په اړه هیر کړي. بله خبره دا ده چې ډیری پراختیا کونکي په قصدي ډول د غلطۍ اداره کول له پامه غورځوي ، د پروسس کولو پرځای دوی ته ترجیح ورکوي چې په ساده ډول غلطی پورته ته واړوي.
  • ژبه د کلاسیک OOP میتودولوژي نه پلي کوي ، ځکه چې په خپل خالص شکل کې په Go کې هیڅ حقیقت شتون نلري. په هرصورت، دا د انٹرفیس کارولو په وخت کې ستونزه نده. د OOP نشتوالی د پیل کونکو لپاره د ننوتلو خنډ د پام وړ کموي.

د ټولنې د ګټو لپاره سادگي

پیچلي کول اسانه دي، ساده کول یې ستونزمن دي.

Go د ساده کولو لپاره ډیزاین شوی و او په دې هدف کې بریالی شو. دا د سمارټ پروګرام کونکو لپاره لیکل شوی چې د ټیم کار په ګټو پوهیږي او د سوداګرۍ کچې ژبې له نه ختمیدونکي تغیر څخه ستړي شوي. په خپل آرسنال کې د نسبتا کوچني ترکیب جوړښتونو درلودل، دا په عملي توګه د وخت په تیریدو سره د بدلونونو تابع ندي، نو پراختیا ورکوونکي د پراختیا لپاره ډیر وخت لري، نه د ژبې د نوښتونو د نه ختمیدونکي مطالعې لپاره.

شرکتونه یو شمیر ګټې هم ترلاسه کوي: د ننوتلو ټیټ خنډ دوی ته اجازه ورکوي چې ژر تر ژره یو متخصص ومومي، او د ژبې بې ثباتي دوی ته اجازه ورکوي چې حتی د 10 کلونو وروسته هم ورته کوډ وکاروي.

پایلې

د مغزو لویې اندازې هیڅ فیل هیڅکله د نوبل جایزې ګټونکی نه دی جوړ کړی.

د هغو پروګرامرانو لپاره چې شخصي انا د ټیم روح ته لومړیتوب ورکوي، او همدارنګه تیوریستان چې د اکادمیک ننګونو او نه ختمیدونکي "ځان پرمختګ" سره مینه لري، ژبه واقعیا خرابه ده، ځکه چې دا د عمومي هدف هنري ژبه ده چې تاسو ته اجازه نه ورکوي چې ترلاسه کړي. د خپل کار په پایله کې ښکلا خوښ کړئ او د همکارانو په وړاندې خپل ځان مسلکي وښایاست (په دې شرط چې موږ د دې معیارونو له مخې استخبارات اندازه کړو، نه د IQ په واسطه). په ژوند کې د هر څه په څیر، دا د شخصي لومړیتوبونو مسله ده. د ټولو ارزښتناکو نوښتونو په څیر، ژبه لا دمخه د نړیوال انکار څخه ډله ایز منلو ته اوږده لاره ده. ژبه په خپل سادګۍ کې هوښیار ده، او لکه څنګه چې تاسو پوهیږئ، هر څه ساده دي!

سرچینه: www.habr.com

Add a comment