5
10
テーマ、知りたいこと
長文になりますが、読んでいただきましてありがとうございます。
プログラミングの基本的内容である以下のことは、理解が早かったです。
(1)変数
(2)定数
(3)配列
(4)型
(5)演算子
(6)条件文(if, if else, if elseif else,if break, if continue,switch)
(7)繰り返し文(for, foreach, while , do while)
しかし、上記の内容はすんなり理解できたのに、自分が賢くないのかもしれませんが、以下で示す内容が全く理解できず、書籍やネットの記事、公式ドキュメントの解説文を読んでも、頭の中が???だらけです。たとえ言葉の意味は分かったとしても、ロジックが組めずに手が止まり、うまくつなぎ合わせたり、組み合わせて作るのも苦手です。
①オブジェクト(無数に種類があって、1つ1つの機能や使用方法をちゃんと理解できていない)
②関数
③ライブラリ
④メソッド
⑤クラス
⑥インスタンス
⑦コンストラクタ
⑧継承
⑨インタフェース
⑩ポリモーフィズム
⑪API
触ってきた言語は、以下のものです。
1.フロントエンド:HTML5,CSS3,Javascript
(HTML5とCSS3は厳密にはプログラミング言語ではないですが含めています。)
2.バックエンド:Java,PHP,Python
3.インフラ:AWS
4.その他:Git, Github, Linux, Webデザイン、動画制作(Adobe製品使用しています。)
みんなに聞きたいこと、知りたいこと
プログラミング学習を何年もやってきて、基礎文法は理解が早かったのに、
①~⑪で挙げた内容の理解に時間がかかったり、解説文の意味が全く分からない状態が続いています。私個人としては、現状の問題点が解決できるようになれば、実務の仕事ももっとうまくいくはずと感じています。
また、今流行しているフレームワークなども学習しないといけないと感じております。
(Java:Springboot PHP:Laravel Python:Djangoなど)
自分の課題は明確なので、それが解決できれば以下のこともたくさん作れるようになると思います。
①ポートフォリオをもっと短期間で作れる。
②副業でも案件をバンバン取れる(10万以上)
③IT系の資格も沢山取れる(国家資格からベンダー資格まで)
個人的な所感としては、以上の内容を確信できています。
学習の方法が悪いとか、勉強のやり方が悪いとか、もっとこうすればうまくいくと思います。などなど
多くの方から、様々なご意見をいただきたいです。
きっと、自分自身、悪循環のドツボに嵌まっている状態と感じています。
また、私と同じ悩みを持っている方も結構いらっしゃるのではと考えているので、その方々にも役に立つような意見交換ができる場にしたいです。
背景、状況
学習:独学(数年程度)
環境:一人で勉強してきた身(書籍とYoutubeを使い、周りに質問する人がいない)
学生時代の文系、理系区分:文系(国語より数学が得意な文系)
学力レベル:GMARCH
※スクールは、金額も高く乗り気ではないです。
以上、よろしくお願いいたします。
調査したこと、試したこと
Youtubeやネット記事の検索で以下のキーワードで検索
「プログラミング オブジェクト」
「プログラミング 関数」
「プログラミング ライブラリ」
「プログラミング メソッド」
「プログラミング クラス」
「プログラミング インスタンス」
「プログラミング コンストラクタ」
「プログラミング 継承」
「プログラミング インタフェース」
「プログラミング ポリモーフィズム」
「プログラミング API」
などで出てきた記事や動画をたくさん閲覧し試してきましたが、
自分自身のイメージや想像力が乏しく理解できない。
ChatGPTなどにも聞いてみたりしました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答50件
#1
総合スコア13199
投稿2023/10/29 08:19
理解できないという 11 個には、対象の言語や説明の文脈によって微妙に意味が異なることになるモノが含まれていますが、それらを全く同じとして考えていたりはしないでしょうか。
例えば C では "関数" と呼ぶものは java では "メソッド" だったり "関数" だったりもしますし、 "ライブラリ" 的には "API" と呼ばれたりもします。
#2
退会済みユーザー
総合スコア0
投稿2023/10/29 08:32
jimbeさん、ご意見ありがとうございます。
理解できないという 11 個には、対象の言語や説明の文脈によって微妙に意味が異なることになるモノが含まれていますが、それらを全く同じとして考えていたりはしないでしょうか。
言われてみれば、頭の中で混同し、ゴッチャにしているかもしれません。むしろごっちゃにしています。
また、言葉のあやや微妙なニュアンスの区別も明確についていませんね。
因みに学習の順序としては、フロント側のJavascriptを1日中行うことはあっても、
バックエンドでJava→PHP→Pythonといったように、似たような単元で違いを意識しながら学習しようとやりますが、後になって思い出そうとしたとき、それが混乱のもとになっているかもしれません。
そういった場合の克服方法ってあるのでしょうか?あるのであれば、教えてください。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#3
総合スコア7899
投稿2023/10/29 08:46
とりあえず関数とデータ構造はプログラミングの基本中の基本です。
あと、①と④〜⑩は「オブジェクト指向プログラミング」を学ぶと良いのでは。
ライブラリに関しては使って覚えれば良くて、API は文脈によっていろんな意味で使われますね。
想像ですが、基礎をすっ飛ばしてフロントやバックエンドなどの応用ばかりやってるのでは。
また、ネットで検索すると断片的な知識になりがちなので、まずは書籍で基礎を学ぶべきかと。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
退会済みユーザー
総合スコア0
投稿2023/10/29 09:07
hoshi-takanoriさん、ご回答ありがとうございます。
関数とデータ構造はプログラミングの基本中の基本
基本中の基本をもう一度最初から学習し直します。
①と④〜⑩は「オブジェクト指向プログラミング」を学ぶと良い
ここがやはり皆さんが通る第一の鬼門ですよね。今後はここをまず理解できるように重点的に学習します。
ライブラリに関しては使って覚えれば良くて、API は文脈によっていろんな意味で使われますね。
最初から全部理解して、覚えようと躍起になっていましたね。
知識量を増やすことに集中していたかもしれません。
私の学習方法はかなり間違っていましたね。反省しています。むしろ使い方と機能を覚えることに重点を置くのが良いでしょうか?
基礎をすっ飛ばしてフロントやバックエンドなどの応用ばかりやってる
基礎をわかっているつもりになっていました!基礎固め頑張ります!
ネットで検索すると断片的な知識になりがちなので、まずは書籍で基礎を学ぶべきかと。
私も断片的な知識になりがちだというのはすごく感じていて、
「あそこで使った関数と今やっている関数はこの機能で繋がっているのか」
と感じながら学習できていなかったことが気づけたように思います。
知識を増やすことよりも、つながりを意識した学習に方向転換します。
総じて言えることは、知識を増やすことではなく、仕組みを理解してブラッシュアップすることが大事ということで認識はあっていますでしょうか?
他にもやりがちな間違った学習法があれば教えてください!
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア13733
投稿2023/10/29 09:08
「プログラミング学習を何年もやってきて」いるのに挙げている11個の項目について「理解に時間がかかったり、解説文の意味が全く分からない」とありますが、何がわからないのでしょう?
もう少し具体的に説明いただけますか?
もし、本当に概念そのものがわからず、それらを使ったり作ったりすることができないということであれば、決定的に相性がわるいのであきらめたほうがいいということになると思うのですが、そんなことは無いのだろうと思います。特に「関数」と「ライブラリ」については、基本の内に入りますので、これが何年やってもわからないとは考えにくいです。
4から9については、クラスベースのオブジェクト指向言語/設計で使う用語ですが、これまで経験した言語では必須でない概念なので、なじみがないだけではないでしょうか。
以下の問題に答えられますか?
・ 引数(整数)を2つ(a, b)取り、aのb乗の値(整数)を返す関数expを定義しなさい。
・ expを使って一辺が7の立方体の体積を求め、変数vに代入せよ。
その他、簡単なクラスを作ったり、ライブラリで提供さえれちるクラスのインスタンスを作って、メソッドを呼んだりすることができるのであれば、理解については問題ないと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#6
総合スコア10734
投稿2023/10/29 09:33
色々な言語を勉強されているようですが1つに絞ってみてはどうでしょうか?
もし仕事で全部必要だとしても自習時間はまずは1つ集中的に学習した方が結果的に効率的になるように思います。
学習方法としては書籍が良かったり、動画の方が良かったり人それぞれかと思います。個人的にはYoutubeよりもオンラインコースの方が体系的に学べると思います。
また最初から全部理解しようとすると大変なので、半分くらいの理解で大丈夫だと思います。コーディングしていく内に理解できるようになることも多いですよ。
関数の使い方などはその都度ヘルプを参照しても大丈夫ですし、便利なツール(エディタのアシスト機能など)を使えば良いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア85862
投稿2023/10/29 10:14
編集2023/10/29 11:15記述が具体的でなく、何が分からないのか分からないです。
例えば、
②関数
(A) 単に関数を使ったり定義したりは出来るが、オブジェクト指向の各種概念との関係性が分からない
(B) 既存の関数を呼び出すのは問題なく出来るが、関数を定義することが難しい
(C) 関数を使うのもよくわからない。引数が理解できてないので、呼び出してもエラーになったり、意図しない結果になる
などなど。
Aであれば、「オブジェクト指向でない範囲でのプログラミングは問題なく出来るが、オブジェクト指向がさっぱり分からない」という人はおそらく初心者に多数いると思います。多分そういう人向けの解説書もあったはず。おそらくこのパターンかと思いますが、もしBやCだと、オブジェクト指向に手を出す前にまずそのあたりをしっかりとやりましょう。
①オブジェクト(無数に種類があって、1つ1つの機能や使用方法をちゃんと理解できていない)
の括弧内ですが、これはおそらくクラスのことですね。
「無数に種類」について言えば、具体的な「xxx言語でのxxxクラスのメソッド等」については、そのクラスで大まかにどういうことが出来るかが把握できていれば十分で、「こういうことをするメソッド名はなんだっけ?」「xxというメソッドの引数の順番はどうだっけ?返り値は何クラスだっけ?」のようなことは都度リファレンスを見て書くで十分です。毎日使う物は自然に覚えるし、年に数回しか使わない物はその都度くりかえしリファレンスを見るので十分。
クラスという概念とオブジェクトという概念とメソッドという概念の関係が理解できてないとそれもできないので、駄目ですが。
まずは言語を1つにするというアドバイスには賛成です。
オブジェクト指向周りは言語によって違いがあるので、理解が不確かなまま複数の言語に触れると、余計に混乱するかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
退会済みユーザー
総合スコア0
投稿2023/10/29 10:49
TakaiYさん、ご回答と例題を出していただきありがとうございます。
まず、例題の方をご解答いたします。
前半の方は話がなくなりそうなので、後ほどご回答いたします。
以下の問題に答えられますか?
・ 引数(整数)を2つ(a, b)取り、aのb乗の値(整数)を返す関数expを定義しなさい。
・ expを使って一辺が7の立方体の体積を求め、変数vに代入せよ。
解答例
①Javascript
function exp(a, b) {
return (a ** b);
}
let v = exp(7, 3);
document.write(v);
②Java
public class Main {
public static void main(String[] args) {
int v = exp(7, 3);
System.out.println(v);
}
public int exp(a, b){
return Math.pow(a,b);
}
}
③PHP
<?php function exp(a, b) { return (a ** b); } $v = exp(7, 3); print($v); ?>④Python
def exp(a, b):
return (a ** b)
v = exp(7, 3)
print(v)
以上ですが、ご解答の確認よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#9
退会済みユーザー
総合スコア0
投稿2023/10/29 11:15
meg_ さん、ご回答ありがとうございます。
色々な言語を勉強されているようですが1つに絞ってみてはどうでしょうか?
もし仕事で全部必要だとしても自習時間はまずは1つ集中的に学習した方が結果的に効率的になるように思います。
1つに絞るというのは、よく言われますね。複数言語をやると中途半端な理解に留まってしまうのが理由でしょうか?
学習方法としては書籍が良かったり、動画の方が良かったり人それぞれかと思います。個人的にはYoutubeよりもオンラインコースの方が体系的に学べると思います。
私もUdemyのオンライン良さそうだなと思ったことがありますが、独学時にお値段が高いなと思って諦めてしまいました。会社にお願いするのも大企業に所属しているわけではないので、気が引けます。
また最初から全部理解しようとすると大変なので、半分くらいの理解で大丈夫だと思います。コーディングしていく内に理解できるようになることも多いですよ。
他の方からのご指摘もありましたが、最初から全部理解して、知識量を増やそうとしていました。それが結果的に、今の課題に結びついているようにも思いました。ご指摘を受けてみて、知識量を増やすよりも、使用方法や他の関数との繋がりを大事にする学習方法に変えることにしました。1つの関数を学んだら、関連するものをまた理解していくというやり方に変えていきます。
関数の使い方などはその都度ヘルプを参照しても大丈夫ですし、便利なツール(エディタのアシスト機能など)を使えば良いです。
すべての関数を覚えられないので、結局は、公式ドキュメントで調べる作業から始めるのですか?
エディタのアシスト機能は、vscodeを使用しているので、後で調べてみようと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#10
退会済みユーザー
総合スコア0
投稿2023/10/29 11:36
otn さん、ご回答ありがとうございます。
(A) 単に関数を使ったり定義したりは出来るが、オブジェクト指向の各種概念との関係性が分からない
(B) 既存の関数を呼び出すのは問題なく出来るが、関数を定義することが難しい
(C) 関数を使うのもよくわからない。引数が理解できてないので、呼び出してもエラーになったり、意図しない結果になる
などなど。
Aであれば、「オブジェクト指向でない範囲でのプログラミングは問題なく出来るが、オブジェクト指向がさっぱり分からない」という人はおそらく初心者に多数いると思います。多分そういう人向けの解説書もあったはず。おそらくこのパターンかと思いますが、もしBやCだと、オブジェクト指向に手を出す前にまずそのあたりをしっかりとやりましょう。
私の場合、完全にAに該当しますね。ちょっとそういうことをわかりやすくまとめている解説書を調べてみようと思います。
「無数に種類」について言えば、具体的な「xxx言語でのxxxクラスのメソッド等」については、そのクラスで大まかにどういうことが出来るかが把握できていれば十分で、「こういうことをするメソッド名はなんだっけ?」「xxというメソッドの引数の順番はどうだっけ?返り値は何クラスだっけ?」のようなことは都度リファレンスを見て書くで十分です。毎日使う物は自然に覚えるし、年に数回しか使わない物はその都度くりかえしリファレンスを見るので十分。
私は、今回、ご指摘を受けるまで、調べなくても自力でスラスラ書けるのが理想だと思って、沢山のクラスを覚えようとしていました(-_-;)でもそれをやっていたことで、非効率なのがよくわかりました。諸先輩方も、リファレンスを見て書くで十分という見解で、もっと気軽にプログラミングを行うように考えるべきだと感じました。ご指摘があるまで、自分自身に対して、これくらいできなきゃいけないという変な義務感のようなものを持っていました。
まずは言語を1つにするというアドバイスには賛成です。
オブジェクト指向周りは言語によって違いがあるので、理解が不確かなまま複数の言語に触れると、余計に混乱するかと思います。
やはり、1つ核になる言語を作ってから、他の言語に移るというのがセオリーなのですね。
混乱や混同しているのはそういう理由があるからだというのも理解できました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#11
総合スコア85862
投稿2023/10/29 12:15
私の場合、完全にAに該当しますね。ちょっとそういうことをわかりやすくまとめている解説書を調べてみようと思います。
やはりそうですか。質問文からはそのあたりが明確でなかったので、TakaiYさんは「BかCかもしれない」と思っての質問だったのでしょう。「自分が抱えている問題を言語化して他人に正しく理解してもらう」というのは慣れてないと難しいようです。
ちょっとそういうことをわかりやすくまとめている解説書を調べてみようと思います。
Amazonで「オブジェクト指向」で検索すると良いかと思います。勧める本は特にありませんが、「(言語名)で学ぶオブジェクト指向」的なタイトルより、言語名の入っていないタイトルの本の方が良いと思います。特定の言語向けだと、本来のオブジェクト指向の考え方と、その言語のでオブジェクト指向の実現のための独自の仕組みの区別が付かないかも知れず、そうすると2つ目の言語を学ぶ時の害になるかと思います。とは言え、実例が無いと説明できないので、そういう本でも何らかの特定の言語を使って解説していると思いますので、大差ないかも知れません。
やはり、1つ核になる言語を作ってから、他の言語に移るというのがセオリーなのですね。
セオリーはなくて、人によるとしか言いようがないです。
まあ、外国人から英会話を学ぶ時に、イギリス人とアメリカ人とフィリピン人とオーストラリア人とインド人から同時に学ぶと混乱する気がしますが、その程度の話なので、大丈夫なら平行しても良いかと。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#12
退会済みユーザー
総合スコア0
投稿2023/10/29 12:33
otnさん、ご返信ありがとうございます。
やはりそうですか。質問文からはそのあたりが明確でなかったので、TakaiYさんは「BかCかもしれない」と思っての質問だったのでしょう。「自分が抱えている問題を言語化して他人に正しく理解してもらう」というのは慣れてないと難しいようです。
選択肢を見て、一番近いのがAでした。特に「オブジェクト指向の各種概念との関係性が分からない」が一番に引っ掛かりましたね。そこを改善することがまず一番最初にやることなのかなと思いました。
Amazonで「オブジェクト指向」で検索すると良いかと思います。勧める本は特にありませんが、「(言語名)で学ぶオブジェクト指向」的なタイトルより、言語名の入っていないタイトルの本の方が良いと思います。特定の言語向けだと、本来のオブジェクト指向の考え方と、その言語のでオブジェクト指向の実現のための独自の仕組みの区別が付かないかも知れず、そうすると2つ目の言語を学ぶ時の害になるかと思います。とは言え、実例が無いと説明できないので、そういう本でも何らかの特定の言語を使って解説していると思いますので、大差ないかも知れません。
はい、私自身の場合、根本から「オブジェクト指向」を理解したほうが良いと思ったので、特定の言語に偏って考えるのは避けたほうが良さげに思っています。ネットでお薦めの書籍を購入して学習しようと思います。言語を学ぶのはその後でも遅くないかなとも考えています。
セオリーはなくて、人によるとしか言いようがないです。
まあ、外国人から英会話を学ぶ時に、イギリス人とアメリカ人とフィリピン人とオーストラリア人とインド人から同時に学ぶと混乱する気がしますが、その程度の話なので、大丈夫なら平行しても良いかと。
「オブジェクト指向」が何たるか?を根本から理解した後、同時並行にするか1個得意なものを作るかは自分次第ですかね。ただ学んだことをすぐアウトプットできる脳みそに切り替えていく作業も必要に感じましたね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#13
総合スコア13733
投稿2023/10/29 14:28
僕の質問に対する回答は完璧です。
私の場合、完全にAに該当しますね。
私自身の場合、根本から「オブジェクト指向」を理解したほうが良いと思ったので、特定の言語に偏って考えるのは避けたほうが良さげに思っています。
「オブジェクト指向」が何たるか?を根本から理解
目的は何ですか? 自分もそういう概念を根本的に理解したい方なので、気持ちはわかるつもりですが、それと実際のプログラミングスキルとはあまり関係がないと思っています。
特に「オブジェクト指向」という言葉はいろいろな意味を含んでいるし、いろいろな意味で使われています。言語という範疇でも、Javaはクラスベースのオブジェクト指向ですべてがオブジェクトで構成されていますし、pythonもクラスベースですが、クラスをベースとしてはいません。 また、JavaScriptは元はプロトタイプベースのオブジェクト指向言語です。オブジェクトの構成の基本的なところ(もうすでに習得されていると思いますが)に共通の部分もありますが、多くの部分は言語独自の考え方になっています。
なので、プログラミング理論としてオブジェクト指向とは何なのか、言語による違いはなんなのかなどのことを調べて理解したいということでないのであれば、言語ごとにクラスやメソッドなどの扱いかたを習得していくのがいいのではないかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#14
総合スコア10734
投稿2023/10/29 17:02
編集2023/10/29 17:031つに絞るというのは、よく言われますね。複数言語をやると中途半端な理解に留まってしまうのが理由でしょうか?
理由は下記2点です。
- 一つ言語をマスターすれば2つ目をマスターするのは比較的簡単です。
- 複数言語を並列で学習すると混乱しやすいからです。 例)添え字が0から始まったり、1から始まったり
すべての関数を覚えられないので、結局は、公式ドキュメントで調べる作業から始めるのですか?
よく使う関数は使っているうちに覚えられると思います。
それでもオプションが多いものは全てを覚えるのは難しいですし無駄だとも思います。
また、関数もアップデートされればインターフェースが変わることもありますのでドキュメントの調べた方・読み方を知ることが大事です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#15
退会済みユーザー
総合スコア0
投稿2023/10/29 23:44
TakaiYさん、ご返信ありがとうございます。
すべて完璧だったとのこと、嬉しいです。
書けて当たり前なのかもしれませんが、ちょっとだけスキルアップできた感じに思います。
目的は何ですか? 自分もそういう概念を根本的に理解したい方なので、気持ちはわかるつもりですが、それと実際のプログラミングスキルとはあまり関係がないと思っています。
概念をよく理解して頭に叩き込んでおくことで、開発に対する考え方を学ぶことが重要かと思いまして。
しかし、同時に概念をちゃんと理解してもコードを書けなきゃ意味がないとも思っていますね(^^;
実際のプログラミングスキルは、
①自分でまず作りたいものを考える。
②使いたい機能を列挙する。
③コードを書く。
④エラーが出るので、エラーを解消させる。
⑤使い方が間違っていないかや、エラーの原因部分は調べてみる。
⑥自分の理解が及ばない時は、人に聞く。
⑦もう1度修正したものを動くか試す。
⑧エラーが出れば、またそこを直し、出なければ新しい機能を追加していく。
⑨③に戻る。
そのため、概念を理解しながら、実際にコードをたくさん書いていくのが良いのかと思いました。
特に「オブジェクト指向」という言葉はいろいろな意味を含んでいるし、いろいろな意味で使われています。
ここが一番ややこしく、理解を妨げており、なおかつ混同している部分だと思います。
言語によっても、意味が文脈で異なってくるので、私の場合は、言語による違いを理解する必要はあると思います。
なので、プログラミング理論としてオブジェクト指向とは何なのか、言語による違いはなんなのかなどのことを調べて理解したいということでないのであれば、言語ごとにクラスやメソッドなどの扱いかたを習得していくのがいいのではないかと思います。
私の場合は逆ですね。言語による違いをすっきりさせながら、なおかつ、それぞれの言語ごとにクラスやメソッドの扱い方を習得していく方法をとっていきたいですね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#16
退会済みユーザー
総合スコア0
投稿2023/10/29 23:56
meg_さん、ご返信ありがとうございます。
理由は下記2点です。
- 一つ言語をマスターすれば2つ目をマスターするのは比較的簡単です。
- 複数言語を並列で学習すると混乱しやすいからです。 例)添え字が0から始まったり、1から始まったり
1,2とも思い当たる節はあります。2は配列の部分かと思いますが、普通の配列の機能は理解できても、配列オブジェクトになると途端に違う意味になりますし、理解できていないと思うので、そのあたりをしっかり理解したいですね。
よく使う関数は使っているうちに覚えられると思います。
それでもオプションが多いものは全てを覚えるのは難しいですし無駄だとも思います。
また、関数もアップデートされればインターフェースが変わることもありますのでドキュメントの調べた方・読み方を知ることが大事です。
そうですね。
言語によって、書き始めは異なるとはいえ、よく使う関数は覚えていくと思います。
オプションが多いのを覚えようとしていました。すべて覚えようとしてたのがドツボに嵌っていた原因です。(^^;
そういう勉強法よりも、使用方法や他の関数との関連や繋がり方を重視してやっていきたいと思います。
今までドキュメントをしっかり読んできていないので、今後は、公式ドキュメントも大いに活用していきます。
英語との格闘ですが、大学受験や学生時代も英語はそこまで嫌いではなかったので、頑張ります!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#17
総合スコア36928
投稿2023/10/30 02:57
それが普通だと思います。
その言語の文法を理解することと、その言語に習熟することは別だと思います。
私が大学生だったころは、初めてのプログラミング言語を習熟するためには1000時間、なにかの言語に習熟した後の2つ目以降には500時間が必要と言われていました。
今は、学ぶ環境が整備されているのでそこまでかからないかもしれませんが、初学者から1時間/日で3年ぐらい、仕事で8時間触っていたとしても半年ぐらいかかる計算なので、それほど感覚としてはズレてないと思います。
ちなみに、私が「CSSの初心者を脱したな」と感じたのは4,5年前でして、CSSを触り始めたのが2000年ごろでしたから、20年近くかかっている計算です。一部のすごい人を除いて、アマチュアで割ける時間でやってるとそんなもんだと思います。気長に取り組むか、もっと時間を割くしかないです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#18
総合スコア160
投稿2023/10/30 04:37
編集2023/10/30 04:42まず、プログラミング言語は何かを作るための道具にすぎません。
道具にどういった機能があるかを理解する事は大事ですが、現在のプログラミング言語は膨大な機能があるので、各機能は必要に迫られてから調べて覚えるのでも十分です。現場のプロでも、必要があれば常にググったりAIに投げたりして調べます。実際に何かを作ったりしてみないと判らない事が沢山あるので、そういった経験が少ないのであれば、イメージも湧きにくいのは当たり前です。覚える事を目標にするのではなく、簡単なものからでいいので、何かを作る事を目標にしてください。
私がメインで使っているプログラミング言語は10年以上使用していて、実用上困るレベルが無い程度の知識はあるつもりですが、それでも全ての機能を把握している訳ではありません。うろ覚えだけど使える、というレベルの言語ならそれなりに沢山あります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#19
退会済みユーザー
総合スコア0
投稿2023/10/30 12:44
Lhankor_Mhyさん、ご回答ありがとうございます。
その言語の文法を理解することと、その言語に習熟することは別だと思います。
そうですね。
文法を理解するのは、その言語の入口のようなものと捉えています。
逆に言語を習熟することは、その言語の専門的な奥深い所まで進んでいく。
少しわからなくなっただけでも迷路に嵌ってしまいそうな部分まで追求するように捉えています。
私は、フルスタックエンジニアとして、
「フロントも、バックも、インフラも、デザインも。すべてのフェーズに携わりたい」
というように、少しずつでもいいから幅広い技術を身につけようと思っている人間です。
広く浅くとはなりますが、基礎を身につけた上で、それぞれの仕事を自分一人ですべて1本化できる人間になるのが目標にしています。
社会人になりたての頃、何故、職場でコミュニケーションに齟齬ができて、思ってた仕様と違うものが出来上がったりするのに、一人で全部作る人って居ないんだろうっていうのが素朴な疑問でした。
私が大学生だったころは、初めてのプログラミング言語を習熟するためには1000時間、なにかの言語に習熟した後の2つ目以降には500時間が必要と言われていました。
今は、学ぶ環境が整備されているのでそこまでかからないかもしれませんが、初学者から1時間/日で3年ぐらい、仕事で8時間触っていたとしても半年ぐらいかかる計算なので、それほど感覚としてはズレてないと思います。
ちなみに、私が「CSSの初心者を脱したな」と感じたのは4,5年前でして、CSSを触り始めたのが2000年ごろでしたから、20年近くかかっている計算です。一部のすごい人を除いて、アマチュアで割ける時間でやってるとそんなもんだと思います。気長に取り組むか、もっと時間を割くしかないです。
私が周囲を気にしすぎて、自分の学習と実力の進み具合に焦りを感じすぎでしょうか?
そう思うのは、以下の背景があるからです。
15年前、私は大学1年生で、初めてのプログラミング言語を学習したのがJavaでした。
当時はそこまでプログラミングやITに興味はなかったのですが、社会人になって以降、
世の中の技術の進歩に、ITの発展がものすごい貢献していることを知りました。
本格的に勉強をやり始めたのは10年前です。
Javaだけでも、基本からSpringbootのようなフレームワークまでマスターしたいし、
HTML5/CSS3/JavascriptができればWEBのフロント技術で生きていける。
JQueryやBootstrapなども理解すれば、フロントで苦労しないだろうなと思ったりもしました。
コード書くのも大事だけど、絵をかいたり写真を加工したりデザインも好きだから、WEBデザインもやろう。
逆にPHPでデータベースと連携して、データベースサーバー作るのも楽しそうだな。と思う自分もいて(^^;
さらにWordPressができたら、PHPと一石二鳥で技術の上積みができるかも。AWSも知れば、クラウドの知識も持てる。そうする内に、Pythonが登場して、人工知能や機械学習、生成AIが・・・
少し話が脱線しますが、野球の大谷翔平が二刀流をやっているのだから、ITの世界でも、誰かが挑戦してもいいんじゃないかと何度も思ったことがあります。
本当に楽しさややりがいを強く感じることが多くて、仕事自体は好きですし、沢山の本を買ってはいろいろ学習していました。でも、いろいろやったせいなのか、技術を習得することに終わりがなく、実力の伸びを感じることが難しく、際限が無いなとも思い始めています。でも、辛いとは思っていないです。自分が目標にしていることと、それに向かって学習していること、技術の蓄積や実力がうまく噛み合っていないようにも思っているんですね。そこにとてもジレンマを感じています。
ですので、毎日継続して今の現状を打破していけば、モノにはなるだろうと思ってはいます。
遠回りしてでも、自分の目標を変えずに頑張るか、初心に帰って、1個に集中するか。
私のような考え方をしている人間を、周囲からすれば贅沢言うなって思いますかね?
それとも、その目標を叶えさせてあげたいし、指導のし甲斐がある奴だなと思っていただけるか。
以上、よろしくお願いいたします。長文失礼しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#20
退会済みユーザー
総合スコア0
投稿2023/10/30 13:05
nururiさん、ご回答ありがとうございます!
まず、プログラミング言語は何かを作るための道具にすぎません。
道具にどういった機能があるかを理解する事は大事ですが、現在のプログラミング言語は膨大な機能があるので、各機能は必要に迫られてから調べて覚えるのでも十分です。現場のプロでも、必要があれば常にググったりAIに投げたりして調べます。実際に何かを作ったりしてみないと判らない事が沢山あるので、そういった経験が少ないのであれば、イメージも湧きにくいのは当たり前です。覚える事を目標にするのではなく、簡単なものからでいいので、何かを作る事を目標にしてください。
プログラミング言語は、僕も同じように端的に言えば、生きていくための手段であり、何かを成し遂げるもののひとつであると思います。プロスポーツ選手が、自分がやっている競技が好きで、生きていくための手段と似ていますかね。
はい。覚えることに終始してしまっていたことが、多くの方のご指摘を受けてよく理解できています。暗記するのを今すぐ辞めます。それまでは、エンジニアの諸先輩方が、1000行~5000行もあっという間にスラスラかける人ばかりなのかと思って、そういう人たちに負けられないとも思っていました。自分で、勝手にハードルを高く上げ過ぎていたかもしれません。
簡単なWEBサイトやWEBアプリから作っていってみようと思います。
私がメインで使っているプログラミング言語は10年以上使用していて、実用上困るレベルが無い程度の知識はあるつもりですが、それでも全ての機能を把握している訳ではありません。うろ覚えだけど使える、というレベルの言語ならそれなりに沢山あります。
メイン言語が実用上困らないレベルで、他がうろ覚えっていうレベルというのが、僕が思っていたレベルよりもかなり下でした。何個も言語を理解していて、仕組みがわかってて、バリバリ使える人にならなきゃダメだと自分にプレッシャーや負荷を掛けていたように思います。そのようなレベルでもやっていけるのかって驚きました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#21
総合スコア39
投稿2023/10/30 23:45
他の方も書かれていますが、体系的に学ぶべきだと思います。
算数までは YouTube 等で分かったが、数学になったら、分からなくなったと言っているようなものではないでしょうか。
そういった人の相談を聞いた時、あなたならどんな提案をされますか。
他の人も書かれている通り、個々を摘んで勉強するのではなく、体系立てて学ぶべきだと伝えませんか。
ですので、YouTube などで効率的にという触れ込みで一つまみ一つまみを知って、効率的に勉強している。気になるのはやめましょう。
遠回りでも、書籍やスクールでちゃんと1から学習した方が今後のためにもなります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#22
総合スコア12
投稿2023/10/31 00:04
分からないことがたくさんあることは良いことだと思いますよ。
世間では「ポートフォリオ作れ」「技術記事を書け」「資格取れ」などなど色々な考え方の人がいますが、自分のペースでやりたいことをやればいいと思います。
回答になってるか分かりませんが、一旦そのまま理解してないままでいいので、最後までアプリケーション開発をやってみてはどうでしょうか?
参考書・公式チュートリアル・有識者の記事など、コピペでいいので作りまくること。
実際に作ってから初めて意味が理解できるかもしれません。
あなたは自分がなぜ息ができて、なぜ歩けるのか、そのメカニズムを理解して説明できますか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#23
総合スコア5
投稿2023/10/31 01:50
編集2023/10/31 01:56プログラミング言語の習得と並行して、ソフトウェアの設計・実装・開発方法についても学んだ方が良いと思います。
通常、ソフトウェアの開発は、要件分析、UI、システム設計で機能や仕様が確定した後、
実装するための手段や段取りの検討、ソフトウェアの構造的な設計を行います。
質問者が悩んでいる①~⑪は、プログラミング工程に入る前の段階の構造設計のスキルが必要です。
構造の実装手段がオブジェクト、モジュール、関数、ライブラリ化、APIとなります。
プログラム言語を習得する書籍で、上記の実装手段については記載はありますが、
構造設計(どのように、オブジェクトやモジュール、関数に分割するか、共通機能をライブラリ化するか)については説明不足ですね~
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#24
総合スコア160
投稿2023/10/31 02:06
編集2023/10/31 04:51それまでは、エンジニアの諸先輩方が、1000行~5000行もあっという間にスラスラかける人ばかりなのかと思って、そういう人たちに負けられないとも思っていました。自分で、勝手にハードルを高く上げ過ぎていたかもしれません。
そういう人達も、何かを作るために膨大な積み重ねを繰り返したうえで自然とそうなるだけで、別に最初から色々マスターしてから何か作る訳じゃないですよ。
実際に何かを作ってみると、
・このライブラリや標準クラス使えばコードもっと簡単に短くかけたな…
・ここの設計もっとこうしておけばよかった…
・思ったより使い勝手悪いな…
・(障害が発生した後に)ここでログ残しておけば障害の原因調べるの楽だっただろうな…
など、後になってから色々反省点が出てきます。
こういう実際に作る経験を通して得た知識は、簡単に忘れる事はありません。
メイン言語が実用上困らないレベルで、他がうろ覚えっていうレベルというのが、僕が思っていたレベルよりもかなり下でした。何個も言語を理解していて、仕組みがわかってて、バリバリ使える人にならなきゃダメだと自分にプレッシャーや負荷を掛けていたように思います。そのようなレベルでもやっていけるのかって驚きました。
極論を言ってしまえば、自分が関わる分野で目的の達成や問題解決が出来る能力があればいい訳で、それに必要なスキルが揃っていればやっていく事は出来ます。もちろん、持っているスキルや知識の幅が広ければ、提案出来たり関われる事は多くなります。問題解決に必要な知識・技術が不足していれば、その都度調べたり学習したりする事もあります。
あなたの考える高いレベルがどの程度かは知りませんが、某有名企業に納品して今も動き続けているシステムのフレームワーク設計をやっていたりしますよ。言語を沢山知っているのと、自分や開発チームの持つスキルを把握して設計し、製品に出来るというのは別のスキルです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#25
総合スコア36928
投稿2023/10/31 02:54
社会人になりたての頃、何故、職場でコミュニケーションに齟齬ができて、思ってた仕様と違うものが出来上がったりするのに、一人で全部作る人って居ないんだろうっていうのが素朴な疑問でした。
あ、プロの方なんですか?
では、私のようなアマチュアが出せる口はないですよね。失礼いたしました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#27
総合スコア85862
投稿2023/10/31 05:53
それでも全ての機能を把握している訳ではありません。
何個も言語を理解していて、仕組みがわかってて、バリバリ使える人にならなきゃダメだ
「多くの言語やフレームワークを理解していて、仕組みがわかる」ことと、「全ての機能を把握してリファレンス見ずにコードが書ける」ことは全く別です。
前者は必要だけど、後者は不要。
昔、「lsのオプション全部言える馬鹿」という文(※)も見たことあります。man ls
やls --help
で十分。
※ 五七五になってる
「何個も言語を理解していて、仕組みがわかってて、バリバリ使える人」は、多数いるでしょうね。
目指して良いかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#28
総合スコア85
投稿2023/10/31 07:36
すでにいくつかの質疑応答があるのを拝見して、
「単に関数を使ったり定義したりは出来るが、オブジェクト指向の各種概念との関係性が分からない」
という問題が最も大きい、と思いました。
すでに Java の経験はお有りとの事ですので、基本的かつ古典の GUI ライブラリ Swing を使い、全て手打ちで(IDE を使わずコマンド端末とテキストエディタで)簡単な GUI アプリケーションをひとつ作ってみることをおすすめします。
Java 自体がオブジェクト指向言語なのですが、簡単なプログラムならオブジェクト指向的でない書き方でも作れます。
しかし Java で Swing を使って GUI アプリケーションを書く、となると、どうしてもオブジェクト指向を強く意識せざるを得ません。
とは言え、これは数年もの独学を積んできた方にとっては、そんなに難しいことではないはずです。
「簡単な」のレベルについては、たとえば「足し算だけ電卓」でも何でも良いので、総行数1K未満を目指してみましょう。
こうしたプログラミングを3つ4つやってみれば、オブジェクト指向の使い方は、なんとなく体得できると思います。
<以下は附記>
演算子が(本当に)分かっているなら、関数はすぐ理解できるはずなのです。 ですので、もしかすると、失礼な言い方になりますが、質問者様は「演算子を理解していない」可能性も考えられます。 演算子を本当に理解していないからこそ、その先になかなか進めない……という事情も有り得るからです。
演算子とは、まさに関数です。
関数は、中学の数学で習ったように、y=f(x) という書き方が一般的です。
たとえば加算の+演算子は、a = b + c; と書けるだけでなく、a = add(b, c); とも書けます。
関数にした場合、関数 add( ) が何処かに必要で、それは自分で書かねばならないかも知れませんが、関数 add( ) が「引数2つの算術和を返す関数」であるならば、上記2つの書き方は等価です。
(a = b + c + d; だったらどうするか、と言えば、a = add( b, add(c, d) ); と書けば済みます)
従って、加算演算子+とは、実は
「言語があらかじめ用意してくれた『加算関数を呼び出すための特殊な文法』である」
と言えるのです。
その気になれば、演算子は全て関数の形で書き直すことができます。
今時のコンピューターは、ハードウェアで浮動小数点演算もできますが、振り返ってみれば、最初期のコンピューターが出来る算術演算は、整数の加減算だけでした。
そこで、当時のプログラマー達は、「内部でビット・シフトと足し算を繰り返すことで掛け算ができる機械語プログラム」や、「内部で引き算を繰り返すことで割り算ができる機械語プログラム」を、各自で作っていたのですが、そんな基本的な演算機能は、いちいち皆でバラバラに作るよりも、どこか1箇所で作ったものを皆で使い回した方が、生産性やデバッグなど、多くの点で有利です。
そこで、そうした基本的で便利な機能を集めて、皆で使い回せるように配布する、というプログラミング手法が 1950年代に考え出されました。 これが「ライブラリー」の始まりです。
その頃はまだ C や Java のような高級言語が無かったので、ライブラリーは機械語の形で配布されていましたが、1970年代に入って C などの高級言語が普及し始めると、「ライブラリーは関数を集めたもの」という形になっていきます。
その後、「ソース・プログラム」をコンパイルしてリロケータブルな「オブジェクト・プログラム」を作り、それをリンクして「実行可能プログラム」を作る、というプログラミング作法が普及すると、「ライブラリーはオブジェクトプログラムを集めたもの(加えて各関数のエントリー・ポイント情報を付属したもの)」という形になっていきました。
こうした歴史の積み重ねは、いずれも、「もっと便利に、もっとラクして、同じ事は2度以上書かず、もっと生産性を上げたい」というプログラマー達の欲望によって出来上がってきたものです。
オブジェクト指向は、上記で述べた歴史の後に作られた、「より便利なプログラミング手法」です(とは言っても、もはや古典的な手法となっていますが)。
ですので、こうした歴史的背景を、少しだけでも知っておくと、「なぜオブジェクト指向なのか」が、より理解しやすくなると思います。
ちなみに、前述した「Java で書く1K行未満の簡単な GUI アプリケーション」を、もし C で書いたら、とても1K行では収まらず、かなりの行数を打ち込まなければなりません。 C はオブジェクト指向をサポートしていない言語なので、オブジェクト指向による「ラクさ」を享受できないのです。
これは言い換えると生産性の話です。 そのため、プログラミングの需要が激増するに伴って、C++ や Java などのオブジェクト指向サポート言語が、主流として使われるようになりました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#29
退会済みユーザー
総合スコア0
投稿2023/10/31 11:17
MTTKさん、ご回答ありがとうございます。
他の方も書かれていますが、体系的に学ぶべきだと思います。
ですので、YouTube などで効率的にという触れ込みで一つまみ一つまみを知って、効率的に勉強している。気になるのはやめましょう。
遠回りでも、書籍やスクールでちゃんと1から学習した方が今後のためにもなります。
皆さんのご指摘からわかるように、暗記に走っていたことがよくわかりました。
今後の学習方法は以下のような順序で行っていきます。
1.意味を理解
2.コードを実際に書く。
3.関連するものを調べる。
4.調べたものを整理して、わかりやすくまとめる。(イメージとしてはパワポなどの図解ツールが良いですかね?)
5.組み合わせて使ってみる。
6.エラーが出たら、そのエラーを解決できる対策を見つける。
7.もう1度試して実行できるか試してみる。
8.ブラッシュアップしたものをポートフォリオにする。
1~8に時間をかけてやってみようと思います。
それと、新しい技術に関心を持つことよりも、自分の得意なことを作る方向にシフトチェンジします。今まで、すぐに目新しい技術に飛びついては、すべて中途半端な理解になっていることに気が付けました。勉強の仕方を変えるとともに、日頃の自主学習に工夫をこらしてやってみようと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#30
退会済みユーザー
総合スコア0
投稿2023/10/31 11:54
puchankoさん、ご回答ありがとうございます。
分からないことがたくさんあることは良いことだと思いますよ。
解決するためにやることは多いですが、前向きにとらえたいです。
世間では「ポートフォリオ作れ」「技術記事を書け」「資格取れ」などなど色々な考え方の人がいますが、自分のペースでやりたいことをやればいいと思います。
僕は欲張りな性格なので、自分にできることは全部やろうと思うタイプなので、3つともできるようにするのが目標です。この中で最初にやるとしたら、資格の取得が目標ですね。原理原則がわかっていれば、何か成果物は作れると思うのですよね。取得するなら、言語専用のベンダー資格と、基本情報と応用情報、AWSになるかなと思います。その次は、技術記事になると思います。日頃の学習の積み重ねを日記のようにつけていくのを習慣にしてみようと思います。そして、最後に試行錯誤していった結果が、ポートフォリオかなと思います。最初は規模の小さいものから作っていく予定です。
ただし、自分の体を大事にしなければいけないですし、病気になったら元も子もないので、そこは慎重に行います。
回答になってるか分かりませんが、一旦そのまま理解してないままでいいので、最後までアプリケーション開発をやってみてはどうでしょうか?
参考書・公式チュートリアル・有識者の記事など、コピペでいいので作りまくること。実際に作ってから初めて意味が理解できるかもしれません。
はい。そうですね。自分の中では、WEBアプリ作ってみようかなと思っています。
具体的には、アンケート調査や、申し込みフォームのようなものを想定しています。
フロントエンドをHTML5,CSS,Javascriptで、バックエンドをJavaかPHPで作ろうと思います。
アンケート調査の場合は、Q&A形式で作っていき、最終的にグラフなどを表示して、何かをデータ分析できるようなのがいいかもしれないなと現時点では思っています。統計学とかを改めて学習する必要がありますけど。
あなたは自分がなぜ息ができて、なぜ歩けるのか、そのメカニズムを理解して説明できますか?
今まで、仕組みやメカニズムを考えることが苦手で、それを簡単な言葉で説明することも現時点では難しいです。今上記のことも全く説明できないです。「メカニズム」とおっしゃっているように、プログラミングも各部分が動いて1個のシステムになっていると思いますけど、僕はそういうことを考えて作業するのが得意ではなかったですね。たぶん、逆に今までの知識や技術の蓄積も断片的なままで、穴ぼこだらけなので、修繕する作業が必要ですね。今後は「〇〇と××が相互に動いて全体が動いているんだ」という意識をもって、学習していこうと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#31
退会済みユーザー
総合スコア0
投稿2023/10/31 12:08
tamakichiさん、ご回答ありがとうございます。
プログラミング言語の習得と並行して、ソフトウェアの設計・実装・開発方法についても学んだ方が良いと思います。
通常、ソフトウェアの開発は、要件分析、UI、システム設計で機能や仕様が確定した後、
実装するための手段や段取りの検討、ソフトウェアの構造的な設計を行います。
質問者が悩んでいる①~⑪は、プログラミング工程に入る前の段階の構造設計のスキルが必要です。
構造の実装手段がオブジェクト、モジュール、関数、ライブラリ化、APIとなります。
他の方のご提案と少々異なったので、上記も取り入れてみようと思います。
この類の学習方法についてお聞きしますが、触りとしては、基本情報や応用情報の学習に含まれているように思います。しかし、もっと深い部分を学ぶとすれば、より専門書を漁った方が良いのでしょうか?
プログラム言語を習得する書籍で、上記の実装手段については記載はありますが、
構造設計(どのように、オブジェクトやモジュール、関数に分割するか、共通機能をライブラリ化するか)について>は説明不足ですね~
私も、言語の技術書を買ってやってきましたが、どのような順序でどうやって作るかというような内容ではなく、文法や使い方が乗っているだけで、連綿として詳しい説明が無くて、いつも「この関数はどこでどうやって使って、どれと組み合わせるか?」は、結局ググって調べなくちゃいけない状況になります。そういう作業がなくなれば、もっと開発スピード上がるのにと思いますね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#32
退会済みユーザー
総合スコア0
投稿2023/10/31 12:21
nururiさん、ご回答ありがとうございます。
そういう人達も、何かを作るために膨大な積み重ねを繰り返したうえで自然とそうなるだけで、別に最初から色々マスターしてから何か作る訳じゃないですよ。
実際に何かを作ってみると、
・このライブラリや標準クラス使えばコードもっと簡単に短くかけたな…
・ここの設計もっとこうしておけばよかった…
・思ったより使い勝手悪いな…
・(障害が発生した後に)ここでログ残しておけば障害の原因調べるの楽だっただろうな…
など、後になってから色々反省点が出てきます。
こういう実際に作る経験を通して得た知識は、簡単に忘れる事はありません。
僕には、そういう思考力を養う学習をしていなかったので、このように書いていただくだけで、沢山の山や壁があるなと感じていますが、そこを何とか地道な努力で登っていきます。
極論を言ってしまえば、自分が関わる分野で目的の達成や問題解決が出来る能力があればいい訳で、それに必要なスキルが揃っていればやっていく事は出来ます。もちろん、持っているスキルや知識の幅が広ければ、提案出来たり関われる事は多くなります。問題解決に必要な知識・技術が不足していれば、その都度調べたり学習したりする事もあります。
自分はフルスタックエンジニアの道を模索し、その実現に向けて、日々の業務に悩みながら仕事をしています。自分が関わる分野が多岐に渡るので、どれか1つでも劣ってては駄目だと正直思っています。まだまだ勉強が足りていないと思っていますし、でも何とか今の現状を抜け出してやり抜こうと考えています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#33
退会済みユーザー
総合スコア0
投稿2023/10/31 12:27
Lhankor_Mhyさん、ご返信ありがとうございます。
あ、プロの方なんですか?
では、私のようなアマチュアが出せる口はないですよね。失礼いたしました。
小さなSESの会社で、エンジニアをやらせていただいております。
いやいや、そんなことは決してないです。もっと、ここはこうすればいいのではと遠慮なく言ってください!
一応プロだからと言って、プライドが邪魔してアドバイスを聞かない態度というのは成長が止まってしまうので!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#34
退会済みユーザー
総合スコア0
投稿2023/10/31 12:34
yutamiさん、ご回答ありがとうございます。
質問には独学で数年って書いてあるのに回答への返答には15年前にJavaに触れたって書いてあるの謎過ぎる。
これは、学生の時に学部の授業で受けただけで、15年前の当時は全然、興味も関心も無かっただけです。
仕事でプログラミングしてる方なんですか?
(10年くらいやってるんだとしたらオブジェクトとかがわからないのは謎だが…)
はい、エンジニアではありますが、言語別でとなると、それぞれ1~2年の短い経験期間で、学習した言語のトータルを合わせると、経験が10年という意味です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#35
退会済みユーザー
総合スコア0
投稿2023/10/31 12:43
otnさん、再度のご返信ありがとうございます。
「多くの言語やフレームワークを理解していて、仕組みがわかる」ことと、「全ての機能を把握してリファレンス見ずにコードが書ける」ことは全く別です。
前者は必要だけど、後者は不要。
ご返信いただいた皆様からのアドバイスを聞いて、「仕組みを理解することが大事で暗記は不要」というのを遠回りしましたが理解しました。
昔、「lsのオプション全部言える馬鹿」という文(※)も見たことあります。man lsやls --helpで十分。
※ 五七五になってる
私もLinuxとGitのコマンドを覚えましたが、基本的によく使うコマンドしかわかりませんね。
これを見て、誤った道に踏み入れなくて済むかもしれないと、正直感じてしまいました。
昨日までの自分と決別します。
「何個も言語を理解していて、仕組みがわかってて、バリバリ使える人」は、多数いるでしょうね。
目指して良いかと思います。
ありがとうございます。自分の得意を作り、フルスタックへの道を諦めずに進んでいきたいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#36
退会済みユーザー
総合スコア0
投稿2023/10/31 13:12
kuraiさん、ご回答ありがとうございます。
「単に関数を使ったり定義したりは出来るが、オブジェクト指向の各種概念との関係性が分からない」
という問題が最も大きい、と思いました。
はい、全くおっしゃる通りです。定義はできても、種類、概念、意味、使用法がいっぱいありすぎて、結局どうすればいいのかというのがわからないというのが現状ですね。
すでに Java の経験はお有りとの事ですので、基本的かつ古典の GUI ライブラリ Swing を使い、全て手打ちで(IDE を使わずコマンド端末とテキストエディタで)簡単な GUI アプリケーションをひとつ作ってみることをおすすめします。
「Java Swing」が何たるか調査し、GUIアプリを作ってみようと思います。アドバイスありがとうございます。
しかし Java で Swing を使って GUI アプリケーションを書く、となると、どうしてもオブジェクト指向を強く意識せざるを得ません。
とは言え、これは数年もの独学を積んできた方にとっては、そんなに難しいことではないはずです。
「簡単な」のレベルについては、たとえば「足し算だけ電卓」でも何でも良いので、総行数1K未満を目指してみましょう。
こうしたプログラミングを3つ4つやってみれば、オブジェクト指向の使い方は、なんとなく体得できると思います。
確かに今まで、オブジェクト指向を使って、総行数「1k未満」を書くというのは、なかなか経験が無かったですし、挑戦しがいのあるものだなと思います。1個作れた頃には、今と比較にならないほど成長できていると思います。頑張ってみます!
演算子が(本当に)分かっているなら、関数はすぐ理解できるはずなのです。 ですので、もしかすると、失礼な言い方になりますが、質問者様は「演算子を理解していない」可能性も考えられます。 演算子を本当に理解していないからこそ、その先になかなか進めない……という事情も有り得るからです。
演算子については、算術演算子、代入演算子、比較演算子、条件演算子、論理演算子、ビット演算子、優先順位といったところですかね。ビット演算子が少々面倒かなと思う程度で、他は大丈夫です。
最後のオブジェクト指向が生まれた背景や歴史についても事細かに説明してくださり、興味深く読ませていただきました。ありがとうございます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#37
総合スコア85862
投稿2023/11/01 01:15
編集2023/11/01 01:26演算子が(本当に)分かっているなら、関数はすぐ理解できるはずなのです。
演算子については、算術演算子、代入演算子、比較演算子、条件演算子、論理演算子、ビット演算子、優先順位といったところですかね。ビット演算子が少々面倒かなと思う程度で、他は大丈夫です。
ピントがずれてますね。
演算子とは、まさに関数です。
がポイントで、「~~演算子はわかる」とかは本筋では無いです。
多くの二項演算子は、『左右の値を評価して(評価=変数なら値を取り出す、関数なら呼び出して返値を受け取る)、
その2つの値を引数にして「加算関数」「減算関数」・・・を呼び出す』ということが分かっているかが、kuraiさんの確認です。
ただし、代入演算子や一部の論理演算子は、この形態ではないのですが、見た目は同じようなので、そのあたりの区別が付いているかも重要でしょう。
今回の質問の本筋から外れますが、代入演算子、論理演算子では、上記『』内の記述とどのように違うのか説明できますか?
※ 念のためですが上記の「関数」とは「それぞれの言語で関数と名付けられているもの」ではなくて数学も含めたもっと一般的な意味です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#38
退会済みユーザー
総合スコア0
投稿2023/11/01 01:50
otnさん、ご回答ありがとうございます。
演算子とは、まさに関数です。
がポイントで、「~~演算子はわかる」とかは本筋では無いです。
多くの二項演算子は、『左右の値を評価して(評価=変数なら値を取り出す、関数なら呼び出して返値を受け取る)、
その2つの値を引数にして「加算関数」「減算関数」・・・を呼び出す』ということが分かっているかが、kuraiさんの確認です。
ただし、代入演算子や一部の論理演算子は、この形態ではないのですが、見た目は同じようなので、そのあたりの区別が付いているかも重要でしょう。
ここの部分の意味が全くわかっていないです。ご指導よろしくお願いいたします。
今回の質問の本筋から外れますが、代入演算子、論理演算子では、上記『』内の記述とどのように違うのか説明できますか?
こちらについても、全く言葉にして説明できないです。併せてご指導いただくと嬉しいです。
以上、よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#39
総合スコア160
投稿2023/11/01 01:59
取得するなら、言語専用のベンダー資格と、基本情報と応用情報、AWSになるかなと思います。
情報処理技術者試験ならそこまで高くないですが、ベンダー資格って受験料安くないし、有効期間短かったりするのものもあります。会社が補助出してくれたり、取ってくるのを推奨してるとかじゃなければ特におすすめしません。
正直に厳しい事を言いますが、なんか色々やる気ありそうな事書いてある割に、今まで基本情報も取得していなかったんですか?かなり風呂敷広げてたので、高度情報処理技術者試験くらいに挑むのかと思っていました。15年前の大学生のころにJavaに触れたって事は、もう30中盤以上って事でしょうから、もう悠長に資格の勉強とかやってる場合じゃないと思うんですよね。もし中途採用するなら、質問されているような項目は当たり前に理解しているのが前提で、資格ではなく、過去にどういう仕事に携わってきたか、何を作ってきたか、即戦力としてすぐ仕事が出来るかという実力を判断される年齢です。かなり危機感を持った方がいいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#40
退会済みユーザー
総合スコア0
投稿2023/11/01 02:38
編集2023/11/01 02:50nururiさん、ご回答ありがとうございます。
取得するなら、言語専用のベンダー資格と、基本情報と応用情報、AWSになるかなと思います。
情報処理技術者試験ならそこまで高くないですが、ベンダー資格って受験料安くないし、有効期間短かったりするのものもあります。会社が補助出してくれたり、取ってくるのを推奨してるとかじゃなければ特におすすめしません。
ベンダー資格は、会社が補助を出して、推奨していただけるので大丈夫です。
正直に厳しい事を言いますが、なんか色々やる気ありそうな事書いてある割に、今まで基本情報も取得していなかったんですか?かなり風呂敷広げてたので、高度情報処理技術者試験くらいに挑むのかと思っていました。
このことについては、厳しいことを言われても仕方のないことですね。基本情報を取得できなかった理由としては、現在の試験制度になる前の午後試験で、まだ20代の頃に2度受験し、落ちています。午前問題(科目A)は常に合格点を取れていましたが、午後試験のJavaとアルゴリズムが悲惨過ぎたというのが理由です。両方とも30%の得点率を超えたことがないと思います。特にJavaの基本情報の問題は、解説書を読んでも全く意味不明で理解できず、得点率がいつも10%も行きませんでした。他の言語や表計算にしなかった理由は、実務で使わなかったのと、ただ合格することに正直意味があるのかな?と思って選択しませんでした。当時、ネットで出てくるのは、表計算の記事ばかりでJavaを選択している人の、目から鱗のようなわかりやすくて理解できる解説記事もありませんでした。
15年前の大学生のころにJavaに触れたって事は、もう30中盤以上って事でしょうから、もう悠長に資格の勉強とかやってる場合じゃないと思うんですよね。もし中途採用するなら、質問されているような項目は当たり前に理解しているのが前提で、資格ではなく、過去にどういう仕事に携わってきたか、何を作ってきたか、即戦力としてすぐ仕事が出来るかという実力を判断される年齢です。かなり危機感を持った方がいいと思います。
はい、自分の実力が低いことはわかっておりますし、危機感はあります。勉強のやり方が悪いのと、元々頭が良くないのもどうにか克服して頑張っていければと思います。基本情報と応用情報は何とか合格しようと挑戦します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#41
総合スコア85862
投稿2023/11/01 05:18
ここの部分の意味が全くわかっていないです。ご指導よろしくお願いいたします。
「この文のここの意味が分からない」(例えば「値の評価」とか)というポイントを絞るのじゃなくてまるごと全部だとこういう場での説明は困難です。
対面なら相手が何を知っていて、今しゃべったことの意味が通じたのかとか確認しながら進められるのですが。
特にJavaの基本情報の問題は、解説書を読んでも全く意味不明で理解できず、得点率がいつも10%も行きませんでした。
いまなら問題なく合格できるはずと言うことですかね?
ただ、プログラミングを職業にして1年以上経っているのに基本情報落ちたと言うことは、その後がかなり厳しい気がします。
それとも20代の頃はプログラミングは研修だけでそれ以降全くやってなかったとかですかね?
フルスタックエンジニアを目指すと言うことであれば、プログラミングで躓くレベルではなく、もっと広範囲の知識・スキルが必要でしょうね。
広範囲ということでは、高度情報処理技術者試験の午前1のテクノロジー分野で90%くらい取れるレベル。それで十分と言うことではなくて、最新の具体的な情報とかは含まれてないので、そこがスタート地点と言うことです。それくらいわかるとその先を勉強しても理解しやすいかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#42
退会済みユーザー
総合スコア0
投稿2023/11/01 07:49
otnさん、ご返信ありがとうございます。
「この文のここの意味が分からない」(例えば「値の評価」とか)というポイントを絞るのじゃなくてまるごと全部だとこういう場での説明は困難です。
対面なら相手が何を知っていて、今しゃべったことの意味が通じたのかとか確認しながら進められるのですが。
場を弁えて、伝えることができず申し訳ございません。
自分で調べて、学習してみます。
いまなら問題なく合格できるはずと言うことですかね?
ただ、プログラミングを職業にして1年以上経っているのに基本情報落ちたと言うことは、その後がかなり厳しい気がします。
それとも20代の頃はプログラミングは研修だけでそれ以降全くやってなかったとかですかね?
はい、対策をしっかり講じることで問題無いと思います。
ただ、その先の応用情報もしっかり合格できるレベルで基本情報も合格したいと考えているので、科目A、科目Bとも両方高得点で合格することを自分自身に課しています。
社会人になりたての頃は、プログラミングは、未経験で入社して、ほとんど何も理解できなかったです。
フルスタックエンジニアを目指すと言うことであれば、プログラミングで躓くレベルではなく、もっと広範囲の知識・スキルが必要でしょうね。
広範囲ということでは、高度情報処理技術者試験の午前1のテクノロジー分野で90%くらい取れるレベル。それで十分と言うことではなくて、最新の具体的な情報とかは含まれてないので、そこがスタート地点と言うことです。それくらいわかるとその先を勉強しても理解しやすいかと思います。
自分の道は、前途多難であることは認識しておりますし、悔しいですけど、20代の頃の自分自身が、すごく甘く考えていたことを痛感し反省しています。勿論、今後もまだまだ挫折することも多々考えられますが、まずは、是が非でもスタート地点に建てることを目標に頑張ります!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#43
総合スコア64
投稿2023/11/01 12:39
プログラミングを学ぶこと、プログラミングで稼ぐことが手段になっているから、頭でっかちになっているのです。情報を読み漁ったのなら知識としては入っている筈ですから、あとは実践してください。
自分で何か作りたいものを考え、設計し、それを実現する手段としてプログラミングを使うようになれば自然と技術も付いてきます。
ライブラリなんて理解できなくて構いません。理解できないなら1から作ればいいのです。
それが面倒だから皆使っているだけです。
あと、正直生成AIが出てきた現代で言語にこだわる意味はありません。自分が何を作りたいかを明確に言語化出来る能力の方が大切ですし単なるプログラマーより稼げます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#44
退会済みユーザー
総合スコア0
投稿2023/11/01 13:34
編集2023/11/01 13:38koseteiさん、ご回答ありがとうございます!
プログラミングを学ぶこと、プログラミングで稼ぐことが手段になっているから、頭でっかちになっているのです。情報を読み漁ったのなら知識としては入っている筈ですから、あとは実践してください。
本当にごもっともです。単にプログラミングを学んで稼げるとよく言われますが、それが最終的に手段になって、結局やりたいことが不明確になっているのは、いろいろ読み漁ってきてしまった弊害でしょうか。昔から柔軟性が無く、頭が固いのも弱点です。学んだことをアウトプットすることが今までありませんでしたので、即実践します。
自分で何か作りたいものを考え、設計し、それを実現する手段としてプログラミングを使うようになれば自然と技術も付いてきます。
上の投稿でも記載しましたが、現在想定しているのは、アンケート調査や、申込フォーム、お問い合わせフォームといったところでしょうか?他にも、会員系のWEBサイトや、企業のコーポレートサイトのようなものをまずは作ってみたいと考えています。ただ、あんまり沢山の機能を入れすぎると、永遠に完成しませんよね?人によりますけど、基本的な完成目途は、どの程度の品質と期間で決めてやっていましたか?
ライブラリなんて理解できなくて構いません。理解できないなら1から作ればいいのです。
それが面倒だから皆使っているだけです。
理解できなくてもいいというのは、少し気が楽になりますが、どうしてもチーム開発等で読まなければいけなくなった時、人が書いたものを読めないと自分が困ってしまいますけど、そういう場合に出くわした際は、事前にどのような対策すればよいのですか?もちろん、書いた本人に質問するのは当たり前ですけども。
あと、正直生成AIが出てきた現代で言語にこだわる意味はありません。自分が何を作りたいかを明確に言語化出来る能力の方が大切ですし単なるプログラマーより稼げます。
AIが出てきたことで、人が3か月、半年、1年とかかってたものが、AIが10秒で勝手に作っちゃうというのもあるかもしれませんね。そしたら開発する人も正直要らなくなりますね。
僕は、まだ具体的に言語化できたり、しっかりと思いつくことができませんが、考えているのは私たちの日常生活で何か不便さを感じることが出てきたときにその場で解決することが一番の課題だと考えています。日常生活で、何か困った時に、いつでもどこでも誰かを手助けできる商品を作りたいですね。地味だけど、目立たなくてもよいので、ずっと日常生活になくてはならないものがよいのかなと思います。なるべく短い期間で考えて、具体的な内容に落とし込み行動していきます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#45
総合スコア160
投稿2023/11/02 01:04
編集2023/11/02 06:58自分で何か作りたいものを考え、設計し、それを実現する手段としてプログラミングを使うようになれば自然と技術も付いてきます。
上の投稿でも記載しましたが、現在想定しているのは、アンケート調査や、申込フォーム、お問い合わせフォームといったところでしょうか?他にも、会員系のWEBサイトや、企業のコーポレートサイトのようなものをまずは作ってみたいと考えています。ただ、あんまり沢山の機能を入れすぎると、永遠に完成しませんよね?人によりますけど、基本的な完成目途は、どの程度の品質と期間で決めてやっていましたか?
なんか、もう既に会話がズレてるというか… 自分で何かを作るという事は、作る物の要件定義、使用技術の選定、具体的な設計、スケジュール策定など全て自分で考えてやるんですよ。物作りに必要な技術は、プログラミングするだけじゃないです。実際の案件をやるなら他にも色々する事があるし、不確定要素もあったりしてもっと考える事多いですよ?
ここまでのやり取りを見ていても、恐らくあなたは、自分で考えて物を作るという事を殆どしてこなかったんじゃないですか?エンジニアは技術職であり、創造的な仕事でもあります。足りないものが考える力であることが明白である以上、見栄えが悪かろうが、機能が足りなかろうが、時間が掛かろうが、トレーニングだと思って自分で考えてやってみればいいんですよ。出来上がった物の品質と掛かった時間が、そのまま今のあなたの実力です。反省点があれば、次作る時にフィードバックすればいいんです。
人の言われたままやる、他人に決めて貰う、答えだけ教えて貰うのは楽ですよね。でも、それは近道をしているようで、ただただ自分で考えたり経験する機会を失っているだけです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#46
総合スコア46
投稿2023/11/03 00:41
自分はJavaに絞って学習するのがおすすめです(他の言語を学習していないのもあるけれど…)
Javaは(最近は関数型を取り入れたりしているけど根本は)完全なオブジェクト指向言語であり、公式リファレンスもかなり充実しているので最も向いていると思います。
もしもココでオブジェクト指向について解説して欲しかったわけじゃないのなら以下は読み飛ばしてください。
以下はJavaに絞って回答しています。
例えば3太郎ゲームを作りたい場合、
プログラムは桃太郎、浦島太郎、金太郎の3人の情報を管理しなければなりません。
それぞれが持つ情報を名前、体力、攻撃力、防御力の4つとすると
いちいち
java
1public class Main { 2 public static void main(String[] args){ 3 Momotaro m = new Momotaro(); 4 Urasimataro u = new Urasimataro(); 5 Kintaro k = new Kintaro(); 6 } 7} 8class Momotaro { 9 String name = "桃太郎"; 10 int HP = 100; 11 int ATK = 20; 12 int DEF = 10; 13} 14class Urasimataro { 15 String name = "浦島太郎"; 16 int HP = 70; 17 int ATK = 10; 18 int DEF = 10; 19} 20class Kintaro { 21 String name = "金太郎"; 22 int HP = 200; 23 int ATK = 30; 24 int DEF = 5; 25}
みたいにキャラ毎に書いていたら、今回は3つなのでまだ良いけど10キャラくらいから面倒ですよね?
そこで共通の設計図としてCharaクラスを作ります。
java
1class Chara { 2 String name; 3 int HP; 4 int ATK; 5 int DEF; 6 Chara(String s, int h, int a, int d){ 7 name = s; 8 HP = h; 9 ATK = a; 10 DEF = d; 11 } 12} 13public class Main { 14 public static void main(){ 15 Chara momotaro = new Chara("桃太郎", 100, 20, 20); 16 Chara urasimataro = new Chara("浦島太郎", 70, 10, 10); 17 Chara kintaro = new Chara("金太郎", 200, 30, 5); 18 } 19}
こうする事で、3キャラの管理がしやすくなります。
また、例えば仕様変更が起きて「キャラに「鬼太郎」を増やして、情報に数値の合計である「総合値」を追加したい!」という場合も、
java
1class Chara { 2 String name; 3 int hp; 4 int atk; 5 int def; 6 int overall;// 追加した行 7 Chara(String s, int h, int a, int d){ 8 name = s; 9 hp = h; 10 atk = a; 11 def = d; 12 overall = hp + atk + def;// 追加した行 13 } 14} 15public class Main { 16 public static void main(){ 17 Chara momotaro = new Chara("桃太郎", 100, 20, 20);// (i) 18 Chara urasimataro = new Chara("浦島太郎", 70, 10, 10);// (ii) 19 Chara kintaro = new Chara("金太郎", 200, 30, 5);// (iii) 20 Chara kitaro = new Chara("鬼太郎", 150, 25, 15);// 追加した行 (iv) 21 } 22}
と、たった3行追加するだけで済みます。
これが元のコードだとキャラ毎に追加して、新たにKitaroクラスまで作らなくてはならないので作るのも保守も大変です。
また(i)~(iv)のそれぞれの名前やhpは同じCharaクラスであるにもかかわらず違いますよね?
これが自分的オブジェクト指向の強み その1 です。
同じ設計図(クラス)を使って違う実体(インスタンス)を作り出せるので、仕様変更や保守の観点において大変強いです。
ここで使ったオブジェクト指向特有のものは、
①オブジェクト
⑤クラス
⑥インスタンス
⑦コンストラクタ
です。
同じCharaクラスを使って、Charaクラスの別々のオブジェクト「momotaro」「urasimataro」「kintaro」「kitaro」のインスタンスを生成しました。
生成する時の情報の初期設定をする方法としてコンストラクタを呼び出しています。
言い換えるとCharaクラスと言う設計図を用いて、4つの実物(ここではキャラ)を作り出しました。
こんな感じです。分かり難かったでしょうか…
オブジェクト指向の強みはこの程度じゃないので是非理解して欲しいです…
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#47
総合スコア22
投稿2023/11/04 08:26
これまでやってきたことを読みましたが、以下の内容が学習されていないと思います。
- アルゴリズム
- データベース操作
■アルゴリズムについて
プログラムを作成する前の段階で、作りたい処理をフローチャートに書いてまとめるといった内容です。
最低でも「バブルソート」ぐらいはフローチャートに書き起こせるようにした方が良いと思います。
バブルソートは実務ではプログラミングしないとは思いますが、フローチャートの書き方をバブルソートで憶える感じです。
プログラムを組む前にフローチャートで処理をまとめる癖をつけた方が、フローチャートの段階で不要な処理や効率の悪い処理が見えてきて、スマートなプログラムが書けるようになります。
■データベース操作について
実際の業務では、ほぼデータベース操作が入ってきます。プログラムでの接続方法やデータの追加・更新・削除(SQL文)は学習してください。
具体的には、データベースから情報を取得して、JSONやXMLで返すといった事や、Webであれば値をPOSTしてレコードの追加・更新・削除を行うといった内容です。
■これからの学習について
これからの学習ですが、具体的なプログラムを作る方向で良いと思います。
今現在分からないことは、分からないという事を覚えておいて、プログラムを作っていくとその中で答えが見つかると思います。
何か作りたいものがあれば良いのですが。
僕が以前学習用に作って勉強になったのは、Webで作るGPSロガーです。
スマホから取得した位置情報をWebサーバに送って保存し、保存した位置情報を地図上(GoogleMap)に軌跡で表示するといったプログラムです。
いっけん簡単そうに思えますが、
- フロント
- GoogleMapsの利用(WebAPI)
- バックエンド
- DB操作
- webサーバの構築
- DB構築
- 独自ドメイン取得
- SSLインストール
と、実務でも有効そうなひと通りの作業が必要となります。
これができればWebの案件も受注できるのではないでしょうか。実際、これを作ったおかげで、社内でGPS情報を扱う機能を含む案件で手を挙げる事が出来て仕事になりました。
作りたいものを見つけて楽しんでください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#48
総合スコア11
投稿2023/11/07 20:19
はじめまして。
私も質問者と同意見で、関数以降がなかなか理解できなかったかもしれません。
今では関数化した方がラクなので、決まった型を編集しつつ利用している感じです。
IT業界によくありがちな、知ってて当たり前、こうだよね?みたいな専門用語を並べて
知識をひけらかすような方が多い事に辟易しながらコメント等を見ていました。
(関数とデータ構造はプログラミングの基本中の基本・・・とか、正直どうでもいいです)
プログラムはとにかく書く事が重要かと思いますが、python系だと比較的関数やライブラリ等の
事例も多いような気がするので、サイト探索でコツコツ勉強していくしかないかとは思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#49
総合スコア88
投稿2023/11/08 09:03
流れあんまり読み込めてませんが
クラス・オブジェクトの勉強について
まずはUMLクラス図について勉強してみると良いでしょう。UML自体はすたれてしまったかもしれませんが、クラス図の学習で概念はつかめます。
その次に静的型付け言語であれば何でも良いのでデザインパターンの本を買い、デザインパターンの有無でコードがどう最適化されるかを学習します。そうするとどういう使われ方をするのかがわかります。(今回であればJavaが良さそうです)
※動的型付け言語メインで学習した方だとクラスやオブジェクトの概念がわかりづらいと思います
アルゴリズムとデータ構造
これは学ぶ内容自体ではなく「自分でアルゴリズムを考える力」に必要となります。
既にある場合は無くても良いですが、足りないスキルであればデザインパターンの後ででも取り組むとコーディングに役立つでしょう。
直近の会話内容の勉強方法について
まずは何か作りたいものありきです。
そしてそれを実現するにはどうすればいいか試行錯誤して、足りない知識があれば学習して、を繰り返します。
そうすることでできることの幅が広がっていきます。
作りたいものが大きい場合は、機能を分解して実現も良いでしょう。
とにかく完成形もしくは実現したいことをイメージできることが重要です。
資格勉強について
国家資格系は正直実務コーディングには直接関係しませんが
資格知識があると深みが増すというか、何するにしても精度が上がり、有利です。
学習にはかなりの時間を要するので、取得する場合は集中して可能な限り期間を短くする方がいいでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#50
総合スコア85
投稿2023/11/09 16:49
編集2023/11/10 13:32この投稿は、otn さんにしていただいた補足に、さらに補足するものであり、質問の回答からは外れた話になるのですが(汗)、
「演算子と関数は等価」
という話について、質問者様に理解しやすくなるようにと思い、Java で簡単なサンプルを書いてみました。
(説明のため、わざと「泥臭く書いた」ので、書き方がダサい点はご容赦ください※1)
Java
1class opfn { 2 // 数値オブジェクト 3 static class obj { 4 int num; 5 obj( int a ) { this.num = a; } 6 String toStr() { return Integer.toString( this.num ); } 7 } 8 // 代入演算の関数 9 static void load( obj a, obj b ) { a.num = b.num; } 10 // 算術演算の関数 11 static obj add( obj a, obj b ) { obj r = new obj( 0 ); r.num = a.num + b.num; return r; } 12 static obj sub( obj a, obj b ) { obj r = new obj( 0 ); r.num = a.num - b.num; return r; } 13 static obj mul( obj a, obj b ) { obj r = new obj( 0 ); r.num = a.num * b.num; return r; } 14 static obj div( obj a, obj b ) { obj r = new obj( 0 ); r.num = a.num / b.num; return r; } 15 static obj mod( obj a, obj b ) { obj r = new obj( 0 ); r.num = a.num % b.num; return r; } 16 static obj inc( obj a ) { a.num ++; return a; } 17 static obj dec( obj a ) { a.num --; return a; } 18 // 比較演算の関数 19 static boolean greaterThan( obj a, obj b ) { return a.num > b.num; } 20 static boolean lessThan( obj a, obj b ) { return a.num < b.num; } 21 static boolean equalTo( obj a, obj b ) { return a.num == b.num; } 22 static boolean isOdd( obj a ) { return ( a.num % 2 > 0 ); } 23 static boolean isEven( obj a ) { return ( a.num % 2 == 0 ); } 24 // 論理演算の関数 25 static boolean and( boolean a, boolean b ) { return a && b; } 26 static boolean or( boolean a, boolean b ) { return a || b; } 27 static boolean not( boolean a ) { return !a; } 28 29 public static void main( String args[] ) { 30 obj x = new obj( 5 ); // int x = 5; 31 obj y = new obj( 13 ); // int y = 13; 32 obj z = new obj( 20 ); // int z = 20; 33 System.out.println( "x is " + x.toStr() + ", y is " + y.toStr() + ", z is " + z.toStr() + "\n" ); 34 35 if ( lessThan( x, y ) ) { // if ( x < y ) { 36 System.out.println( "x is less than y\n" ); 37 } 38 else { 39 System.out.println( "x is not less than y\n" ); 40 } 41 42 if ( greaterThan( z, x ) ) { // if ( z > x ) { 43 System.out.println( "z is greater than x\n" ); 44 } 45 else { 46 System.out.println( "z is not greater than x\n" ); 47 } 48 49 System.out.println( "x = y + z" ); 50 load( x, add( y, z ) ); 51 System.out.println( "x is " + x.toStr() + ", y is " + y.toStr() + ", z is " + z.toStr() + "\n" ); 52 53 System.out.println( "x ++" ); 54 inc( x ); 55 System.out.println( "x is " + x.toStr() + ", y is " + y.toStr() + ", z is " + z.toStr() + "\n" ); 56 57 obj i = new obj( 0 ); // int i = 0; 58 System.out.println( "while ( x > y && z < x )" ); 59 while ( and( greaterThan( x, y ), lessThan( z, x ) ) ) { 60 if ( isEven( i ) ) { // if ( i % 2 == 0 ) { 61 dec( x ); // x -- 62 } 63 inc( y ); // y ++; 64 inc( z ); // z ++; 65 inc( i ); // i ++; 66 System.out.println( "i is " + i.toStr() + ", x is " + x.toStr() + ", y is " + y.toStr() + ", z is " + z.toStr() ); 67 } 68 } 69}
ご覧の通り、main( ) の中では、いわゆる「計算」に使われる演算子は見当たりません。 関数呼び出しの括弧(前置単項演算子)、オブジェクト宣言の =(2項演算子)、メソッド呼び出しのドット(前置単項演算子)、などは、やむを得ず使っていますが(※2)。
上掲のサンプルでは、演算子の代わりをする関数をわざわざ自前で書いていますが、もし、あるプログラミング言語において、代入演算だとか算術演算だとかをしてくれる関数が、あらかじめ用意されているならば、= とか + とか && とかは、書く必要が無いのです(※3)。
なお、この話は、現代のフルスタックエンジニアにとって必須の知識とは言えませんが、理解しておいて損は無い話だ、と私は思います。
<附記>
Java など、現在使われている多くの言語では、使用頻度が高そうな演算については、言語仕様で演算子が用意されていますが(そのようなビルトイン演算子であっても、やろうと思えば関数(プログラム)の形で書き下せる、ということは、前掲サンプルで示した通り)、
Java 言語に無い演算子、たとえば平方根や立方根、階乗、総和(シグマ)、総積(パイ)、行列演算、複素数演算、というような演算については、プログラマー側が用意するか、あるいは誰かが書いてくれたライブラリーを借用する事になります。
これは、演算子が有りさえすれば、前掲サンプルのように、わざわざ関数やメソッドを書いたり、Math クラスなど使わずに済んだのに……という話であり、つまるところ「演算子は関数と等価」という話の証明でもあります。
(実のところ + や - だって、Math クラスに実装して都合が悪いということなど、ほぼ無いはずである)
なお、この話は「逆も真なり」で、言語仕様が許すなら、関数は全て演算子の形で書くことも出来ます。 Java においても + 演算子は「文字列の連結」という「隠されたメソッド」を呼んでいるはずだと思います(もっとも、Java では、それ以外に新たな演算子をプログラマー側で追加定義する事は出来ないようですが)。
ちなみに C++ では演算子オーバーロードという言語機能によって、既存の演算子に新規の関数機能を割り当てることが出来ます。 個人的には使うつもりはありませんが……。
<脚注>
※1
本サンプルは、2項演算子なら2つの引数を、単項演算子なら1つの引数を、という「分かりやすさ」を優先して書いたので、Java プログラムとして好ましい形では無いものになってしまっている。
obj のメンバーを操作するような関数処理は、obj クラスのメソッドとして実現すべきである。
※2
実際に動作する、あらゆるプログラムは、最終的には機械語プログラムの形になって実行される。 しかし機械語プログラムには演算子も関数も無いし、識別名すら無く、ただ機械語命令という2進ビット列が有るのみである。 つまり我々が普段プログラミングで扱う演算子や関数は、すべて「2進ビット例の『仮の姿』」に過ぎない。
2進ビット列で「あらゆるプログラムが書ける」ということは、関数がプログラムであるのと同様に、演算子もプログラムで実現されているということに他ならない(前回投稿#28 を参照;掛け算や割り算の機械語プログラムを云々~)。 すなわち演算子と関数は「低レベルの話においても」等価と言える。
※3
ただし、計算の全てを関数やメソッドで書き下すなら、演算の優先順位はプログラマー側が考慮しなければならない点に留意。 機械語プログラムにおいても同様に、数式はプログラマーが脳みそを使って順序立ててからプログラミングしなければならない。
(その面倒臭さが、コンパイラー言語発明の一因だったのではないかと思える)
2023/11/10 15:28
こちらの回答が他のユーザーから「質問内容に関係のない回答」という指摘を受けました。
本投稿の冒頭で述べた通り、これが本質問に対する直球の回答投稿では無いことは認めますが、しかし「関係のない内容」ではありません。
質問者様は「関数やライブラリといったものから理解できず苦労」されているという事なのですから、関数がどういう性質を持っているかを示した本投稿が「関係のない内容」であるとは、私には到底考えられません。
ただし、そう考えるのは私であって、私が気付いていない事は、もちろん有ると思います。 本投稿のどういう点が「関係のない回答」であるのか、具体的にご提示いただければ、どう改善するかを考えるきっかけが掴めるかも知れません。 修正依頼をされた方におかれましては、ぜひ具体的なご指摘をいただきたいと思います。 よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。