Ухаалаг програмистуудын хувьд Go яагаад муу вэ?

Уг нийтлэлийг өмнө нь нийтэлсэн нийтлэлийн хариу болгон бичсэн болно antipodean нийтлэл.

Ухаалаг програмистуудын хувьд Go яагаад муу вэ?

Сүүлийн хоёр жил гаруйн хугацаанд би Go програмыг ашиглан тооцооны системтэй тусгай RADIUS серверийг суулгаж байна. Замдаа би хэлний нарийн ширийн зүйлийг сурч байна. Хөтөлбөрүүд нь маш энгийн бөгөөд энэ нийтлэлийн зорилго биш боловч Go-г ашиглах туршлага нь үүнийг хамгаалахад цөөн хэдэн үг хэлэх ёстой. Go нь ноцтой, өргөтгөх боломжтой кодын улам бүр түгээмэл хэл болж байна. Энэ хэлийг Google-ээс бүтээсэн бөгөөд үүнийг идэвхтэй ашигладаг. Эцэст нь хэлэхэд, би Go хэлний загвар нь UN intelligent програмистуудад муу гэж би бодож байна.

Сул програмистуудад зориулагдсан уу?

Сул дорой хүмүүс асуудлын талаар ярьдаг. Үзэл бодол, мөрөөдлийн тухай хүчтэй яриа...

Go сурахад маш хялбар тул та кодыг бараг ямар ч сургалтгүйгээр унших боломжтой. Хэлний энэ онцлогийг дэлхийн олон компаниудад кодыг үндсэн бус мэргэжилтнүүд (менежер, үйлчлүүлэгч гэх мэт) хамт уншихад ашигладаг. Энэ нь Дизайнаар удирдуулсан хөгжүүлэлт зэрэг арга зүйд маш тохиромжтой.
Шинэхэн програмистууд ч гэсэн нэг юмуу хоёр долоо хоногийн дараа нэлээд зохистой код гаргаж эхэлдэг. Миний судалж байсан ном бол "Go Programming" (Марк Саммерфилд). Ном маш сайн, хэлний олон нюансыг хөндсөн. Java, PHP гэх мэт шаардлагагүй ярвигтай хэлнүүдийн дараа ид шидийн дутагдал нь сэтгэл сэргээдэг. Гэхдээ эрт орой хэзээ нэгэн цагт олон хязгаарлагдмал програмистууд хуучин аргыг шинэ салбарт ашиглах санаатай байдаг. Энэ үнэхээр шаардлагатай юу?

Роб Пайк (хэлний гол үзэл сурталч) Go хэлийг ойлгоход хялбар, хэрэглэхэд үр дүнтэй үйлдвэрлэлийн хэл болгон бүтээжээ. Энэ хэл нь том багуудад хамгийн их бүтээмжтэй байхаар бүтээгдсэн бөгөөд үүнд эргэлзэх зүйл алга. Олон шинэхэн програмистууд дутагдаж байгаа олон шинж чанарууд байдаг гэж гомдоллодог. Энгийн байх гэсэн энэхүү хүсэл нь хэлний зохион бүтээгчдийн ухамсартай шийдвэр байсан бөгөөд энэ нь яагаад хэрэгтэй байгааг бүрэн ойлгохын тулд хөгжүүлэгчдийн урам зориг, тэд Go дээр юу хүрэхийг хичээж байсныг ойлгох ёстой.

Тэгвэл яагаад үүнийг ийм энгийн болгосон юм бэ? Роб Пайкийн хэлсэн хэдэн ишлэл энд байна:

Энд гол анхаарах зүйл бол манай програмистууд судлаач биш юм. Дүрмээр бол тэд нэлээд залуу хүмүүс, магадгүй тэд Java, эсвэл C/C++, эсвэл Python-д суралцсан байж магадгүй юм. Тэд гайхалтай хэлийг ойлгодоггүй, гэхдээ бид тэднээс сайн програм хангамж бүтээхийг хүсч байна. Тийм учраас хэл нь ойлгомжтой, сурахад хялбар байх ёстой.

Тэр С-тэй бараг адилхан танил байх ёстой. Google-д ажилладаг программистууд карьераа эрт эхлүүлдэг бөгөөд ихэвчлэн процедурын хэл, ялангуяа 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 хэл ч мөн адил хийдэг.

Их буунаас эхлээд бор шувуу хүртэл

Мөн straitjacket нь галзуугийн хэмжээтэй тохирч байх ёстой. Станислав Лек.

Олон хэт шүтэн бишрэгчид Go-д ерөнхий эмүүдийг бий болгох өөр нэг механизм байдаг - тусгал гэж хэлж болно. Мөн тэд зөв байх болно ... гэхдээ зөвхөн ховор тохиолдолд.

Роб Пайк бидэнд анхааруулж байна:

Энэ бол болгоомжтой ашиглах ёстой хүчирхэг хэрэгсэл юм. Онцын шаардлагагүй бол үүнээс зайлсхийх хэрэгтэй.

Википедиа бидэнд дараахь зүйлийг хэлдэг.

Тусгал гэдэг нь програмыг гүйцэтгэх явцад өөрийн бүтэц, зан төлөвийг хянаж, өөрчлөх үйл явцыг хэлнэ. Тусгалын суурь болох програмчлалын парадигмыг тусгал програмчлал гэж нэрлэдэг. Энэ бол метапрограмчлалын нэг төрөл юм.

Гэсэн хэдий ч, та бүхний мэдэж байгаагаар бүх зүйлийг төлөх ёстой. Энэ тохиолдолд энэ нь:

  • програм бичихэд бэрхшээлтэй
  • програмын гүйцэтгэлийн хурд

Тиймээс тусгалыг том калибрын зэвсэг шиг болгоомжтой ашиглах хэрэгтэй. Бодлогогүй тусгал ашиглах нь унших боломжгүй программ, байнгын алдаа, хурд багатай байдалд хүргэдэг. Гайхалтай программист бусад, илүү прагматик, даруухан хамтран ажиллагсдынхаа өмнө өөрийн кодыг харуулах чадвартай байх нь зүгээр л нэг зүйл юм.

Си-гийн соёлын ачаа? Үгүй ээ, олон хэлнээс!

Хөрөнгө мөнгөтэй зэрэгцээд өр өв залгамжлагчид үлддэг.

Хэл нь бүхэлдээ Си өвд үндэслэсэн гэж олон хүн үздэг ч энэ нь тийм биш юм. Энэ хэл нь шилдэг програмчлалын хэлнүүдийн олон талыг агуулсан байдаг.

синтакс

Юуны өмнө дүрмийн бүтцийн синтакс нь Си хэлний синтакс дээр суурилдаг. Гэсэн хэдий ч DELPHI хэл нь бас чухал нөлөө үзүүлсэн. Тиймээс програмын уншигдах чадварыг ихээхэн бууруулдаг илүүдэл хаалтуудыг бүрэн устгасан болохыг бид харж байна. Мөн энэ хэл нь DELPHI хэлэнд хамаарах “:=” операторыг агуулна. Багцын тухай ойлголтыг ADA гэх мэт хэлнээс авсан. Ашиглагдаагүй байгууллагуудын мэдэгдлийг PROLOG хэлнээс авсан болно.

Семантик

Багцууд нь DELPHI хэлний семантик дээр суурилагдсан. Багц бүр нь өгөгдөл, кодыг багтаасан бөгөөд хувийн болон төрийн байгууллагуудыг агуулдаг. Энэ нь багцын интерфейсийг хамгийн бага хэмжээнд хүртэл багасгах боломжийг танд олгоно.

Төлөөлөх аргаар хэрэгжүүлэх ажиллагааг DELPHI хэлнээс авсан.

Эмхэтгэл

С программыг эмхэтгэж байх үед Go програмыг боловсруулсан гэсэн хошигнол бий. Хэлний давуу талуудын нэг нь түүний хэт хурдан эмхэтгэл юм. Энэ санааг DELPHI хэлнээс авсан. Go багц бүр DELPHI модультай тохирч байна. Эдгээр багцуудыг үнэхээр шаардлагатай үед л дахин эмхэтгэдэг. Тиймээс дараагийн засварын дараа та програмыг бүхэлд нь эмхэтгэх шаардлагагүй бөгөөд зөвхөн эдгээр өөрчлөгдсөн багцуудаас хамаарах өөрчлөгдсөн багцууд болон багцуудыг дахин эмхэтгэх хэрэгтэй (мөн тэр үед ч гэсэн багцын интерфейс өөрчлөгдсөн тохиолдолд л).

Өндөр түвшний бүтээн байгуулалтууд

Энэ хэл нь C зэрэг доод түвшний хэлтэй ямар ч холбоогүй олон янзын өндөр түвшний бүтцийг агуулдаг.

  • Шугамууд
  • Хэш хүснэгтүүд
  • Зүсмэлүүд
  • Нугас бичих нь RUBY гэх мэт хэлнээс зээлсэн байдаг (харамсалтай нь олон хүн ойлгодоггүй эсвэл бүрэн чадавхидаа ашигладаггүй).

Санах ойн менежмент

Санах ойн менежмент нь ерөнхийдөө тусдаа нийтлэл байх ёстой. Хэрэв C++ гэх мэт хэл дээр хяналтыг хөгжүүлэгч бүрэн хариуцдаг бол DELPHI гэх мэт дараагийн хэлүүдэд лавлагаа тоолох загварыг ашигласан. Энэ аргын хувьд өнчин кластерууд үүссэн тул мөчлөгийн лавлагааг зөвшөөрөхгүй байсан тул Go нь ийм кластеруудыг илрүүлдэг (C# гэх мэт). Нэмж дурдахад, хог цуглуулагч нь одоогоор мэдэгдэж байгаа ихэнх хувилбаруудаас илүү үр дүнтэй бөгөөд бодит цагийн олон ажилд аль хэдийн ашиглагдаж болно. Хувьсагчийг хадгалах утгыг стек дээр хуваарилж болох нөхцөл байдлыг хэл нь өөрөө хүлээн зөвшөөрдөг. Энэ нь санах ойн менежерийн ачааллыг бууруулж, програмын хурдыг нэмэгдүүлдэг.

Зэрэгцээ байдал ба зэрэгцээ байдал

Хэлний параллель байдал, өрсөлдөх чадвар нь магтаалын аргагүй юм. Ямар ч доод түвшний хэл Go-тэй алсаас өрсөлдөж чадахгүй. Шударга байхын тулд уг загварыг тухайн хэлний зохиогчид зохион бүтээгээгүй, харин зүгээр л хуучин сайн ADA хэлнээс зээлж авсан гэдгийг тэмдэглэх нь зүйтэй. Энэ хэл нь бүх CPU-г ашиглан сая сая зэрэгцээ холболтыг боловсруулах чадвартай бөгөөд олон урсгалтай кодын хувьд ердийн түгжрэл, уралдааны нөхцөлтэй холбоотой хүндрэл багатай асуудлуудтай байдаг.

Нэмэлт ашиг тус

Ашигтай байвал хүн бүр аминчлан зүтгэх болно.

Хэл нь бидэнд хэд хэдэн эргэлзээгүй ашиг тусыг өгдөг:

  • Төслийг бүтээсний дараа нэг гүйцэтгэгдэх файл нь програмуудыг байрлуулах ажлыг ихээхэн хялбаршуулдаг.
  • Статик бичих, төрөл гаргах нь тест бичихгүйгээр таны кодын алдааны тоог мэдэгдэхүйц бууруулж чадна. Би тест огт бичихгүйгээр хийдэг, кодын чанар нь төдийлөн мууддаггүй зарим програмистуудыг мэднэ.
  • Маш энгийн хөндлөн эмхэтгэл, стандарт номын сангийн маш сайн зөөврийн байдал нь платформ хоорондын програмуудыг хөгжүүлэхэд ихээхэн хялбар болгодог.
  • RE2 тогтмол илэрхийллүүд нь урсгалд аюулгүй бөгөөд гүйцэтгэх хугацааг урьдчилан таамаглах боломжтой.
  • Ихэнх төслүүдийг гуравдагч талын хүрээгүйгээр хийх боломжийг олгодог хүчирхэг стандарт номын сан.
  • Хэл нь түүнийг хэрхэн шийдвэрлэхээс илүүтэй асуудалд анхаарлаа төвлөрүүлэхэд хангалттай хүчтэй боловч асуудлыг үр дүнтэй шийдвэрлэхэд хангалттай бага түвшний хэл юм.
  • Go эко систем нь туршилт, баримтжуулалт, багцын удирдлага, хүчирхэг линтер, код үүсгэх, уралдааны нөхцөл илрүүлэгч гэх мэт бүх тохиолдолд ашиглахад зориулагдсан хэрэгслүүдийг аль хэдийн багтаасан болно.
  • Go хувилбар 1.11 нь алдартай VCS хостинг дээр суурилагдсан семантик хамаарлын удирдлагыг нэвтрүүлсэн. Go экосистемийг бүрдүүлдэг бүх хэрэгслүүд эдгээр үйлчилгээг нэг дороос код татаж авах, бүтээх, суулгахад ашигладаг. Энэ бол гайхалтай. 1.11 хувилбар гарч ирснээр багц хувилбарын асуудал мөн бүрэн шийдэгдсэн.
  • Хэлний гол санаа нь ид шидийг багасгахад оршдог тул энэ хэл нь хөгжүүлэгчдэд алдаатай ажиллахад түлхэц өгдөг. Энэ нь зөв, учир нь өөрөөр хэлбэл энэ нь алдаатай ажиллахаа мартдаг. Өөр нэг зүйл бол ихэнх хөгжүүлэгчид алдаатай харьцах асуудлыг зориудаар үл тоомсорлож, тэдгээрийг боловсруулахын оронд алдааг дээш нь дамжуулахыг илүүд үздэг.
  • Энэ хэл нь сонгодог OOP аргачлалыг хэрэгжүүлдэггүй, учир нь цэвэр хэлбэрээр Go-д виртуал байдал байдаггүй. Гэсэн хэдий ч интерфэйсийг ашиглахад энэ нь асуудал биш юм. OOP байхгүй байгаа нь эхлэгчдэд нэвтрэх саадыг эрс багасгадаг.

Олон нийтийн ашиг тусын тулд энгийн байдал

Үүнийг төвөгтэй болгоход хялбар, хялбарчлахад хэцүү.

Go нь энгийн байхаар бүтээгдсэн бөгөөд энэ зорилгодоо хүрч чаддаг. Энэ нь багаар ажиллахын ач тусыг ойлгодог, Enterprise түвшний хэлнүүдийн эцэс төгсгөлгүй хувирамтгай байдлаас залхсан ухаалаг програмистуудад зориулагдсан болно. Арсеналдаа харьцангуй бага хэмжээний синтаксик бүтэцтэй тул цаг хугацааны явцад бараг өөрчлөгддөггүй тул хөгжүүлэгчид хэлний шинэчлэлийг эцэс төгсгөлгүй судлахын тулд биш харин хөгжүүлэхэд маш их цаг гаргадаг.

Компаниуд ч гэсэн хэд хэдэн давуу талыг олж авдаг: нэвтрэх бага саад бэрхшээл нь мэргэжилтэнг хурдан олох боломжийг олгодог бөгөөд хэл нь өөрчлөгддөггүй нь 10 жилийн дараа ч гэсэн ижил кодыг ашиглах боломжийг олгодог.

дүгнэлт

Тархины том хэмжээ нь нэг ч зааныг Нобелийн шагналтан болгож байгаагүй.

Хувийн эго нь багийн сэтгэлгээг илүүд үздэг програмистууд, түүнчлэн эрдэм шинжилгээний сорилт, эцэс төгсгөлгүй "өөрийгөө сайжруулах"-д дуртай онолчдын хувьд хэл нь үнэхээр муу, учир нь энэ нь ерөнхий зориулалтын гар урлалын хэл бөгөөд үүнийг олж авахыг зөвшөөрдөггүй. Ажлынхаа үр дүнгээс гоо зүйн таашаал авч, хамт ажиллагсдынхаа өмнө өөрийгөө мэргэжлийн гэдгээ харуулах (бид оюун ухааныг IQ-ээр бус эдгээр шалгуураар хэмжсэн тохиолдолд). Амьдралын бүх зүйлийн нэгэн адил энэ нь хувийн тэргүүлэх чиглэлийн асуудал юм. Бүх үнэ цэнэтэй инновацийн нэгэн адил хэл нь нийтээр үгүйсгэхээс эхлээд олон нийтэд хүлээн зөвшөөрөгдөх хүртэл урт замыг туулсан. Хэл нь энгийн байдлаараа овсгоотой бөгөөд та бүхний мэдэж байгаагаар ухаалаг бүх зүйл энгийн байдаг!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх