02. პრობლემების გადაჭრის პრინციპები
ფიქრის პროცესი
პროგრამირება არ არის გაუჩერებლად კლავიატურაზე კაკუნი და ენთერის შემდეგ შედეგის მიღება - პროგრამირება არის ფიქრის პროცესი. ეს არის სტრატეგიების და (გამომუშავებადი) უნარების ერთობლიობა, რომელსაც იყენებ სხვადასხვა პრობლემებთან (არა მხოლოდ კოდის) გასამკლავებლად.
დეკომპოზიცია
დიდი და კომპლექსური პრობლემა შეიძლება უფრო მარტივი იყოს, თუ პრობლემების იზოლირებას და დაყოფას შევეცდებით.
აბსტრაქცია
შავი ყუთის პრინციპი
სირთულეებთან გამკლავება არაგადამწყვეტი დეტალების დამალვით. შავი ყუთის პრინციპი.
ჩვენ ვიყენებთ ფუნქციას move()
, მაგრამ არ ვღელავთ იმაზე, თუ როგორ იწვევს ამ ფუნქციის გამოყენება კარელის გადაადგილებას სამყაროში. ვიცით ის, რომ თუ კარელი დგას x უჯრაზე, move()-ის გამოძახების შემდეგ იდგება მის შემდეგ უჯრაზე. ეს ორი (საწყისი და საბოლოო პოზიცია) არის შავი ყუთის input და output.
გარემოს მომზადება ერთ პრობლემაზე კონცენტრაციისთვის
აბსტრაქცია მხოლოდ სხვის მიერ შექმნილ კოდზე არ ვრცელდება. მუშაობისას მნიშვნელოვანია რომ ვიყოთ კონცენტრირებული მხოლოდ ერთ და მარტივ პრობლემაზე. ეს ნიშნავს, რომ ჩვენივე პასუხისმგებლობაა ამისთვის საჭირო გარემოს მომზადება (სხვა ფუნქციების შექმნა ისე, რომ მერე მათზე ფიქრის გარეშე გამოვიყენოთ)
ზოგადი ამოხსნის შექმნა და გამოყენება
კიდევ ერთი კრიტიკულად მნიშვნელოვანი როლი, რომელსაც აბსტრაქცია ასრულებს, არის სხვადასხვა პრობლემებისთვის ერთი ამოხსნის მოძიება - თუ უმნიშვნელო დეტალებს ჩამოვაშორებთ, სრულიად სხვადასხვა სფეროების ამოცანები იდენტურია - ერთისთვის ამოხსნის მოძებნით ყველას გადავჭრით.
ალგორითმის დიზაინი
top down
დეკომპოზიციის ბუნებრივი შედეგი არის ის, რომ საბოლოო ჯამში გვაქვს პატარ-პატარა პრობლემები. ჩვენ ჯერ ამ პრობლემებს გავუმკლავდებით და შემდეგ დავაკავშირებთ ერთმანეთს მომდევნო საფეხურებზე.
bottom up
უფრო ხშირად ვიდრე არა, ასე სრულყოფილი დეკომპოზიცია შეუძლებელია. ზოგჯერ შეიძლება ერთი ქვეპრობლემის ამოხსნამ უკეთესი წარმოდგენა მოგვცეს იმაზე, როგორ შეიძლება დავუკავშიროთ იგი სხვებს. ასევე, კიდევ ერთი უპირატესობა ის არის, რომ ქვეპრობლემის ამოხსნისას მაშინვე შეიძლება კოდის ვერიფიკაცია, მაშინ, როდესაც top-downის დროს გამოყენებული ფუნქციები იმპლემენტირებული არ არის და ვერ გამოვიძახებთ.
პასუხისმგებლობების განაწილება
ერთი ფუნქცია უნდა ასრულებდეს ერთ კონკრეტულ დავალებას
სხვა შემთხვევაში ექნება გაუთვალისწინებელი შედეგები
მარტივი უნდა იყოს ფუნქციის მუშაობის აღწერა
(x input-ზე არის y output). დაწერეთ ეს აღწერა კომენტარად ფუნქციის დასაწყისში
ფუნქციის ზომა
ფუნქცია არ უნდა იყოს გრძელი - თუ 5-6 ხაზს გადააჭარბებს, დაფიქრდით ხომ არ შეიძლება რამე ნაწილის გატანა სხვა ფუნქციაში
რეფაქტორინგი
თუ ორ ფუნქციას მსგავსი კოდი აქვს, საერთო ნაწილები გაიტანეთ ცალკე ფუნქციად.
მსგავსებების ამოცნობა (pattern recognition)
გამოყენებადი ბლოკების შექმნა. აბსტრაქციების გამოყენებადობა პირდაპირ კავშირშია მათ რაოდენობასთან - ძალიან ბევრი თუ იყო შეიძლება არ გაგახსენდეთ, ან თავიდან შექმნათ თითქმის იმავენაირი აბსტრაქცია. ამიტომ მნიშვნელოვანია დააკვირდეთ მსგავს კოდებს და
კრეატიული სამუშაოს სტრატეგიები
აუცილებელია რამდენიმე "სესია"
- პრობლემის გაცნობა ნიშნავს, რომ ტვინი პასიურად მასზე ფიქრობს
- ახალი ინფორმაციის გასაანალიზებლად საჭიროა დრო და იტერაცია
ბლოკებთან გამკლავება
- დროებით თავის დანებება ყველაზე ეფექტური გამოსავალია
- ბლოკის შემთხვევაში პაუზის აღება
ორივესთვის აუცილებელია, რომ არ გეჩქარებოდეს
ძალისხმევის კონტროლი
პრობლემის გადაჭრის პროცესში არ უნდა წვალობდე
წინა პუნქტის გავრცობა - თქვენი ენერგია უნდა იყოს მიმართული აღქმაზე, ადაპტირებაზე და არა ძალდატანებაზე. თუ წვალობ, ე.ი. ამ პრობლემის გადასაჭრელად მზად არ ხარ და გჭირდება უნარების გაუმჯობესება სხვა რესურსებით.
ამ უნარების ათვისება
მიუხედავად იმისა, რომ ეს პრინციპები ყოველდღიური ცხოვრების ნაწილია, მათი გამიზნულად და გაცნობიერებლად გამოყენება დაკვირვებით ვარჯიშს მოითხოვს. თავიდან თუ არ გამოგივათ, ხელი არ ჩაიქნიოთ - ზოგჯერ პრობლემაზე მუშაობის დასრულების შემდეგ შეიძლება აღიქვათ როგორი იქნებოდა სწორი დეკომპოზიცია, ან ნაწილებზე top down-ით იმუშაოთ, სხვაზე bottom up-ით და ასე არეულად. მთავარია შეეცადოთ, დააკვირდეთ და ყველა მცირე წარმატება დააფასოთ.