Hello! My name is Walker. I am eleven years old (as the title says) and I'd like to know a good programming language that's easy to use. One that's good for making games. (I like games :p). So, Javascript is fine, but I don't really know how to make jar programs. If you know what to use to make those, please let me know. I am using a mac, btw. And I'm also interested in Python. Would that work for me? Thanks!
Jar programs are the output of java, which minecraft is coded in, there are countless tutorials on the internet, and it is a very beginner-friendly language. However, most people like to use lwjgl(used by minecraft) for graphics, audio, and textures, along with slick util. however, as lwjgl uses opengl, which is NOT very beginner friendly, it may not be the best place to start out, and many good ones are either fixed-pipeline, and/or outdated, however, I did find these: http://www.youtube.com/playlist?list=PLRIWtICgwaX0u7Rf9zkZhLoLuZVfUksDP, which are made programmable, and very recent, however, make sure you use lwjgl 2.9 with those, lwjgl 3 just came out, so, no tuts. However, if you are interested in python, blender uses python as its scripting language, so you could use blender's game engine to make a game(it's also the top free program for modeling and animation), that would be great, because python is also fairly beginner friendly, however, blender, isn't. If anything, javascript is probably the simplest, however, with a lot of dedication, and an open mind, you could learn anything you want in no time! And by no time, I mean like, well, months, IT'LL FEEL LIKE NO TIME! All of the above are capable and made for 3d graphics, however, if you just want to use 2d, then use slick2d (yes, slick2d and slick-util ARE different) I hope you your passion, good luck!
PS: be warned, java 8 is NOT compatible with minecraft
Minecraft runs fine with the Java 8 VM. I imagine what you mean is that, for creating say, mods with Forge or another framework, it is best to use the version Minecraft is built for. If you make and compile a Mod with Java 8, for example, than you would need to run Minecraft with Java 8 for it to work (otherwise you get a ClassFormatException as I recall as the version doesn't match).
I'd like to know a good programming language that's easy to use. One that's good for making games. (I like games :p). So, Javascript is fine, but I don't really know how to make jar programs. If you know what to use to make those, please let me know. I am using a mac, btw. And I'm also interested in Python. Would that work for me? Thanks!
In terms of Good programming languages that are easy to use, you can ask 10 different people and often get 10 different answers to that question, and really all those answers would be right (well unless they suggested really esoteric languages, I suppose). Regardless of age I just think the most important thing is to simply choose one- That is, spend less time making a decision, and more time learning. There are other threads here where posters ask the question and seem to be hemming and hawwing about what language to use for over a month.
"JAR" Programs are For Java. it is short for "Java ARchive" and they are actually just .ZIP files, which you may know about. Most development software for Java will provide a way to allow you to do that.
My opinion is to avoid Java at first, for learning. The reason I say that- and, again, bear in mind my first mention that you'll practically get different answers from everybody) is that Java has a lot of "technical debt" IMO. What I mean by that is that in creating a typical Java Program, you will need to fiddle with the IDE, and every IDE is different in how they work and how they are configured. And you'll also have technical debt in the form of pre-existing code such as the libraries that the previous poster mentioned.
Personally I don't think Python is a poor first choice. However you need to be aware that- again, like the other poster said- you won't learn everything needed overnight. I would personally suggest- if you want to create games- to set yourself much more accessible goals, and then move up from there. Start by creating small, simple programs, then take what you learned and make a game. For example, you might start with simple programs that ask for input and perform a calculation or print out what you wrote at first- that get's you familiar with some of the basics of programming (getting user input, processing, output). After that, you can create simple text-based games such as a guessing game or Rock Paper Scissors, for example. The important thing is to have lots of short-term goal milestones, so that you don't feel like you aren't learning anything.
Python, I think, works ideal for that purpose- It's quite easy to setup and run scripts, and you can get started quite quickly, and it's fairly straightforward. With Java you'd need to create a project, set a main class, and do a bunch of other stuff. Python is far quicker to "jump into". For a personal anecdote, my work typically involves C# and Java programming, but sometimes I'll be want for some basic capability- say, maybe I want to count all the lines of C# code in my companies entire codebase. For that, I will usually write a script quickly in Python, even though I am actually more proficient and comfortable in C# (or even Java). The reason is for the reasons I described above- for C#/Java I have to go through this whole "new project" setup, whereas with Python, I just edit a new text file pretty much, and run it directly.
My opinion is to avoid Java at first, for learning. The reason I say that- and, again, bear in mind my first mention that you'll practically get different answers from everybody) is that Java has a lot of "technical debt" IMO. What I mean by that is that in creating a typical Java Program, you will need to fiddle with the IDE, and every IDE is different in how they work and how they are configured. And you'll also have technical debt in the form of pre-existing code such as the libraries that the previous poster mentioned.
This is true for virtually every language, as much so as is for Java. For interpreted languages, your environment and how you set it up will differ. For compiled languages, your build system is likely going to be different from someone else's. And in both cases, the IDE is something you're going to have to learn. Also, absolutely every language is going to have the same issues with libraries, many (C++ for example) far more so than Java. There are annoying problems every beginning programmer is going to have to tackle soon enough, regardless what path they take. Targeting Java exclusively for this reeks of personal bias.
Also, if your complaint is difficulty setting up an IDE, then my simple answer is Processing. If you are a beginner and don't want to configure eclipse or learn how to use libraries right away, then download Processing immediately. It's honestly the simplest IDE/environment I've ever used.
Hence why I recommend Processing - it rids you of any setup, you can just open up the editor and start writing relevant Java code right away, similar to Python in IDLE.
Also, although Python is a fantastic language, I can't say I'd personally recommend it for beginners. In my admittedly limited experience, dynamic typing and the quirks of an interpreted language usually only serve to confuse beginners and obscure important-to-learn concepts (such as data types and the relationship between written code and machine code) from them.
This is true for virtually every language, as much so as is for Java. For interpreted languages, your environment and how you set it up will differ. For compiled languages, your build system is likely going to be different from someone else's. And in both cases, the IDE is something you're going to have to learn. Also, absolutely every language is going to have the same issues with libraries, many (C++ for example) far more so than Java. There are annoying problems every beginning programmer is going to have to tackle soon enough, regardless what path they take. Targeting Java exclusively for this reeks of personal bias.
Also, if your complaint is difficulty setting up an IDE, then my simple answer is Processing. If you are a beginner and don't want to configure eclipse or learn how to use libraries right away, then download Processing immediately. It's honestly the simplest IDE/environment I've ever used.
I was speaking in Java compared to Python. It's also why I mention C# later in my anecdote.
For comparison:
1. Creating a scratch program in Java
1. Start IDE Software.
2. Select that IDE software's "New Project" option.
3. Select the project template. Choose Console Application.
4. now you have a scratch program you can write code in. Usually the boilerplate static class is filled out. Then you can run and build it from the IDE. Usually.
It's pretty much the same deal for C#, as well as C++. (though the latter often doesn't fill in boilerplate, which is fine because there is less of it for a simple program than with Java/C# in absolute terms)
Compared to Python
1. Start Text Editor
2. Write Python code
Most text Editors (SciTe, Editpad Pro, etc) are configurable. I have Editpad for example set to provide the option to run Python scripts directly. And even just using Notepad and the interpreter has a very quick Debug cycle. Also having to start a new solution/project when I want to do a quick one-off operation is overkill. Python is dynamically typed, but also strongly typed. The relationship between written code and machine code is pretty much trivial. I find it hard to believe any experienced developer would ever suggest that understanding the relationship between a piece of written code and the resulting machine code is important unless said experienced developer has just emerged from a time warp from the the 90's or earlier.
Either you misunderstand what I mean by "the relationship between written code and machine code" (I'm not suggesting you should literally learn machine code or assembly), or you're seriously missing out on the importance of understanding the computer your code is running on. Understanding the gist of how your machine actually runs the code that you write is incredibly helpful in understanding why languages are how they are, as well as data types (and their behaviour, e.g. floating point precision and integer overflow/underflow), and a good portion of any runtime errors you get, and is absolutely essential if you ever want to write really fast/efficient code (though to be fair, this last one isn't especially relevant to beginners).
Also, again, why I recommend Processing:
1. Start Processing editor (will open up a new sketch by default)
2. Write Java code
Either you misunderstand what I mean by "the relationship between written code and machine code" (I'm not suggesting you should literally learn machine code or assembly) or you're seriously missing out on the importance of understanding the computer your code is running on. Understanding the gist of how your machine actually runs the code that you write is incredibly helpful in understanding why languages are how they are, as well as data types (and their behaviour, e.g. floating point precision and integer overflow/underflow), and a good portion of any runtime errors you get, and is absolutely essential if you ever want to write really fast/efficient code (though to be fair, this last one isn't especially relevant to beginners). I understood it to mean the relationship between written code and machine code in terms of things such as what circumstances the machine code of a given piece of C code is going to unroll loops or use a jump table for a switch versus a chained set of je instructions.Sounds more like you are talking about a basic understanding of the parts of a computer and how things like von neumann architecture influence even high level languages. Also, again, why I recommend Processing:
1. Start Processing editor (will open up a new sketch by default)
2. Write Java code Well Java code coupled to Processing's Library, at least. Still better than those stupid tutorial libraries that CS courses often have. "Now let's write a string class, as this is our 7th attempt, we shall call it GString." It reminds me of POV-Ray but with interaction, if that makes sense.
Also I want to yell at whomever broke the forums quoting some time ago.
I think you're jumping a little too far ahead. We're trying to help someone who knows basically nothing get started. The best way to accomplish that is to just write code. To work a project. A little calculator. A silly little number guessing game.
I don't think someone needs to understand the difference between big and little endian, or needs to know the instruction set for their particular processor. You learn about the simple stuff first: variables, if/else, loops. Then you move onto something a little more complex: object oriented design, recursion. Then you move onto something a little more complex: data structures (linked lists, trees, queues, stacks). Then you try and implement (basic) versions of data structures to try and understand them.
Maybe you compile a list of things you're familiar with, and implement those in other languages to get a feel for them. You tinker with other language's specific features. You start feeling out what you prefer doing general stuff in. You start to get a grasp of why Java is useful in this situation, or why Python is great for setting up a simple script.
But for someone just starting out? I wouldn't recommend learning anything about low level stuff, or how a machine executes code until you're out of the beginner stage. Novice level programmers should begin to understand that stuff. Someone that understands what a binary tree is, and can at least build a simple calculator that reads prefix/infix/postfix notation and computes for example.
You're also hammering BC's point home. Ask 10 different people, get 10 different answers. He recommends Python. You recommend Java. The benefit of starting with Python here at least is you aren't tied down to using a specific library. I prefer C# to Java for general work. But it's complicated to get setup compared to Python. For someone as young as OP, OOP might be a bit complex. Python may be easier for them to start.
I've heard python is a decent choice but I've also heard java is a good first choice too. If you chose Java I would recommend buying Head First Java it's a little hard to understand at first but it gets better.
Rollback Post to RevisionRollBack
My specs: i5 4460, Msi guard pro H97, Sapphire r9 280x, Western digital blue 1 TB, evga 600b psu, Nzxt h440
i started coding at 12 with qBASIC for dos... and i would recommend the same except that qBASIC is dead... modern gaming languages are pretty much C++, Java, and .NET/VisualStudio/DirectX(all pretty much the same, and all in the same place), and none of those are very fun to jump in to... your best bet is to start with a scriptkiddy language like Python or Ruby or Jscript... but i would highly recommend you to check into basic logic and methodology before you even bother with a language... Udemy has a couple free courses i think... once you understand the how and why, learning the words to put to it are easy... methods rarely change, words kinda do... Stanford if i remember right also has Computer Science and Methodology 101 all taped and put on Youtube for anyone to watch, with the basic homework assignments available for download also(they will not grade it though) so thats another thing to keep in mind... you may also want to look into Unity, its a free platform to create pretty powerful games that accepts code in multiple languages
EDIT: i found those stanford courses... start here
Visual Studio and DirectX are not programming languages. Visual Studio is a multi-language IDE and DirectX is a graphics framework/library. And they are not at all the same. I'm not sure what "scripkiddy" is even supposed to mean, but you just listed 3 scripting languages, so maybe that's what you meant? In any case, no, trying to learn abstract computer science before using a programming language is a very bad idea, and if you start using a programming language to solve interesting problems, you'll learn the "logic and methodology" in the process anyway.
Basically, what I'm saying is, you obviously have no clue what you're talking about. Please just stop trying to give people advice on things you don't understand yourself.
I started with bash on Linux (or dash, doesn't matter) and then moved on to some simple html. The great thing is, you can download any webpage and take a look inside it! (Just hit Ctrl+s) But, I personally think that C# in Unity3d is the best option for advanced languages!
CPU: G3258 @ 4.2Ghz 1.25v stock cooler! Oh and it's ~28C right now - Motherboard: ASUS Z97-K - RAM: 12GB - HDD: 256 GB 840 EVO ~560 MB/s R/W and two HDDS in RAID0 - GPU: GTX 750 unfortunately ONLY1427 Mhz PSU: A random 500W one with sleeved cables! - Case: CM Silencio 452. Yes its very quiet NOT ANYMORE
Mouse: Logitech M90 - Keyboard: Logitech K270. Came bundled with a M185 OS: Win10 Pro - Monitor: 3x ASUS 24" 1080p for a total resolution of 5760x1080!
Personally, I would disregard all above advice. I started with bash on Linux (or dash, doesn't matter) and then moved on to some simple html. The great thing is, you can download any webpage and take a look inside it! (Just hit Ctrl+s) But, I personally think that C# in Unity3d is the best option for advanced languages!
Personally, I would tell the OP to shove some numbers where ever the code goes, and see what happens.
Visual Studio and DirectX are not programming languages. Visual Studio is a multi-language IDE and DirectX is a graphics framework/library. And they are not at all the same. I'm not sure what "scripkiddy" is even supposed to mean, but you just listed 3 scripting languages, so maybe that's what you meant? In any case, no, trying to learn abstract computer science before using a programming language is a very bad idea, and if you start using a programming language to solve interesting problems, you'll learn the "logic and methodology" in the process anyway.
Basically, what I'm saying is, you obviously have no clue what you're talking about. Please just stop trying to give people advice on things you don't understand yourself.
VS/DX/.NEt are all integral parts of creating a game, and are all obtained and manipulated through VisualStudio... if you don't know the term scriptkiddy you have never done a days worth of real programming in your life... go ask any professional with a college degree what they learned first, and where you should start... Stanford has some of the best programming courses in the nation, and when you sign up for it the first class you take is the one i posted links to... in fact you take 3 of those before you start learning a real language, that way you do not learn the words, because those change, but you instead learn the finer points and how it all works, that way you can write in any language you choose with little hassle...
so.. "Basically, what I'm saying is, you obviously have no clue what you're talking about. Please just stop trying to give people advice on things you don't understand yourself."
lol no they're not. You can use any other IDE than Visual Studio, you could use OpenGL rather than DirectX (or you could use a higher level library that wraps either of these, e.g. SFML, SDL, etc.), and you certainly don't need to program in a .NET language. I'm amazed, even for a kid, that you don't know any of this. This is really, really basic stuff. Learn what a programming language is, what an IDE is, and what a library is (specifically, what OpenGL and DirectX are), come back, and we can talk. But until you at least get down the fundamentals, you're wasting your time trying to talk about programming because it's simply a subject you don't know anything about yet.
VS/DX/.NEt are all integral parts of creating a game, and are all obtained and manipulated through VisualStudio... No. First off, I wouldn't touch DirectX or Direct3D with a ten-foot-pole from any .NET language because the managed wrappers are absolute garbage. OpenTK, which uses OpenGL, is far better in terms of support and tutorials. the only .NET framework using DX/D3D that is any good is XNA and it has been put on a backburner. DirectX (if we talk of the graphics part, we really mean Direct3D, as DirectX consists of Direct3D, DirectWrite, DirectGraphics, Direct2D (formerly DirectDraw) as well as legacy support for DirectPlay, DirectSound, and DirectMusic. Essentially- using DirectX from C#/VB.NET is a massive pain in the ass and hardly worth the effort. The main problem is that MS refuses to abandon COM interfaces for it, so the entire thing is pain in the butt. (the DirectX Wrapper for .NET is awful, too- not even worth bothering with). It is actually kind of ironic that OpenGL and SDL are more accessible and easier to use from .NET than MS's own graphics/sound tech, but they've made their own bed in that regard- if they want to focus on business WPF/Silverlight/Azure and MVC development that is up to them, I suppose.At any rate, none of Visual Studio, DirectX, nor .NET are integral components for creating a game, considering games existed long before any of them existed and continue to be created without them (Heck, Minecraft uses none of those).if you don't know the term scriptkiddy you have never done a days worth of real programming in your life... go ask any professional with a college degree what they learned first, and where you should start... Stanford has some of the best programming courses in the nation, and when you sign up for it the first class you take is the one i posted links to... in fact you take 3 of those before you start learning a real language, that way you do not learn the words, because those change, but you instead learn the finer points and how it all works, that way you can write in any language you choose with little hassle... so.. "Basically, what I'm saying is, you obviously have no ****ing clue what you're talking about. Please just stop trying to give people advice on things you don't understand yourself."Why so many ellipses College Degrees and post-secondary education are meaningless, and such courses focus on Computer Science, not programming. The difference between Computer Science and Programming is about the same as the difference between being a Biologist and a medical practitioner. They do teach valuable things such as creating certain data structures (Linked Lists, Doubly-Linked Lists, Red/Black Trees, Self-balancing binary trees, etc. but often fail to contain in their curricula the more important facet of actually deciding which to use. So while one learns the concepts and important parts of programming, they don't necessarily learn how to apply them properly.
http://www.blender.org/
http://www.lwjgl.org/
http://slick.ninjacave.com/slick-util/
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
PS: be warned, java 8 is NOT compatible with minecraft
PSS: here's gimp for texturing: http://www.gimp.org/
Minecraft runs fine with the Java 8 VM. I imagine what you mean is that, for creating say, mods with Forge or another framework, it is best to use the version Minecraft is built for. If you make and compile a Mod with Java 8, for example, than you would need to run Minecraft with Java 8 for it to work (otherwise you get a ClassFormatException as I recall as the version doesn't match).
In terms of Good programming languages that are easy to use, you can ask 10 different people and often get 10 different answers to that question, and really all those answers would be right (well unless they suggested really esoteric languages, I suppose). Regardless of age I just think the most important thing is to simply choose one- That is, spend less time making a decision, and more time learning. There are other threads here where posters ask the question and seem to be hemming and hawwing about what language to use for over a month.
"JAR" Programs are For Java. it is short for "Java ARchive" and they are actually just .ZIP files, which you may know about. Most development software for Java will provide a way to allow you to do that.
My opinion is to avoid Java at first, for learning. The reason I say that- and, again, bear in mind my first mention that you'll practically get different answers from everybody) is that Java has a lot of "technical debt" IMO. What I mean by that is that in creating a typical Java Program, you will need to fiddle with the IDE, and every IDE is different in how they work and how they are configured. And you'll also have technical debt in the form of pre-existing code such as the libraries that the previous poster mentioned.
Personally I don't think Python is a poor first choice. However you need to be aware that- again, like the other poster said- you won't learn everything needed overnight. I would personally suggest- if you want to create games- to set yourself much more accessible goals, and then move up from there. Start by creating small, simple programs, then take what you learned and make a game. For example, you might start with simple programs that ask for input and perform a calculation or print out what you wrote at first- that get's you familiar with some of the basics of programming (getting user input, processing, output). After that, you can create simple text-based games such as a guessing game or Rock Paper Scissors, for example. The important thing is to have lots of short-term goal milestones, so that you don't feel like you aren't learning anything.
Python, I think, works ideal for that purpose- It's quite easy to setup and run scripts, and you can get started quite quickly, and it's fairly straightforward. With Java you'd need to create a project, set a main class, and do a bunch of other stuff. Python is far quicker to "jump into". For a personal anecdote, my work typically involves C# and Java programming, but sometimes I'll be want for some basic capability- say, maybe I want to count all the lines of C# code in my companies entire codebase. For that, I will usually write a script quickly in Python, even though I am actually more proficient and comfortable in C# (or even Java). The reason is for the reasons I described above- for C#/Java I have to go through this whole "new project" setup, whereas with Python, I just edit a new text file pretty much, and run it directly.
Good luck!
This is true for virtually every language, as much so as is for Java. For interpreted languages, your environment and how you set it up will differ. For compiled languages, your build system is likely going to be different from someone else's. And in both cases, the IDE is something you're going to have to learn. Also, absolutely every language is going to have the same issues with libraries, many (C++ for example) far more so than Java. There are annoying problems every beginning programmer is going to have to tackle soon enough, regardless what path they take. Targeting Java exclusively for this reeks of personal bias.
Also, if your complaint is difficulty setting up an IDE, then my simple answer is Processing. If you are a beginner and don't want to configure eclipse or learn how to use libraries right away, then download Processing immediately. It's honestly the simplest IDE/environment I've ever used.
Also, although Python is a fantastic language, I can't say I'd personally recommend it for beginners. In my admittedly limited experience, dynamic typing and the quirks of an interpreted language usually only serve to confuse beginners and obscure important-to-learn concepts (such as data types and the relationship between written code and machine code) from them.
I was speaking in Java compared to Python. It's also why I mention C# later in my anecdote.
For comparison:
1. Creating a scratch program in Java
1. Start IDE Software.
2. Select that IDE software's "New Project" option.
3. Select the project template. Choose Console Application.
4. now you have a scratch program you can write code in. Usually the boilerplate static class is filled out. Then you can run and build it from the IDE. Usually.
It's pretty much the same deal for C#, as well as C++. (though the latter often doesn't fill in boilerplate, which is fine because there is less of it for a simple program than with Java/C# in absolute terms)
Compared to Python
1. Start Text Editor
2. Write Python code
Most text Editors (SciTe, Editpad Pro, etc) are configurable. I have Editpad for example set to provide the option to run Python scripts directly. And even just using Notepad and the interpreter has a very quick Debug cycle. Also having to start a new solution/project when I want to do a quick one-off operation is overkill. Python is dynamically typed, but also strongly typed. The relationship between written code and machine code is pretty much trivial. I find it hard to believe any experienced developer would ever suggest that understanding the relationship between a piece of written code and the resulting machine code is important unless said experienced developer has just emerged from a time warp from the the 90's or earlier.
Also, again, why I recommend Processing:
1. Start Processing editor (will open up a new sketch by default)
2. Write Java code
Also I want to yell at whomever broke the forums quoting some time ago.
I don't think someone needs to understand the difference between big and little endian, or needs to know the instruction set for their particular processor. You learn about the simple stuff first: variables, if/else, loops. Then you move onto something a little more complex: object oriented design, recursion. Then you move onto something a little more complex: data structures (linked lists, trees, queues, stacks). Then you try and implement (basic) versions of data structures to try and understand them.
Maybe you compile a list of things you're familiar with, and implement those in other languages to get a feel for them. You tinker with other language's specific features. You start feeling out what you prefer doing general stuff in. You start to get a grasp of why Java is useful in this situation, or why Python is great for setting up a simple script.
But for someone just starting out? I wouldn't recommend learning anything about low level stuff, or how a machine executes code until you're out of the beginner stage. Novice level programmers should begin to understand that stuff. Someone that understands what a binary tree is, and can at least build a simple calculator that reads prefix/infix/postfix notation and computes for example.
You're also hammering BC's point home. Ask 10 different people, get 10 different answers. He recommends Python. You recommend Java. The benefit of starting with Python here at least is you aren't tied down to using a specific library. I prefer C# to Java for general work. But it's complicated to get setup compared to Python. For someone as young as OP, OOP might be a bit complex. Python may be easier for them to start.
"Programmers never repeat themselves. They loop."
How dare ye curse our supreme overlord, the Squidinator, the Big Orange, the citricsquid!
"Programmers never repeat themselves. They loop."
I'm back
EDIT: i found those stanford courses... start here
Basically, what I'm saying is, you obviously have no clue what you're talking about. Please just stop trying to give people advice on things you don't understand yourself.
@Ryuku Ok, ok I won't be cheeky...
Yes its very quietNOT ANYMOREPersonally, I would tell the OP to shove some numbers where ever the code goes, and see what happens.
VS/DX/.NEt are all integral parts of creating a game, and are all obtained and manipulated through VisualStudio... if you don't know the term scriptkiddy you have never done a days worth of real programming in your life... go ask any professional with a college degree what they learned first, and where you should start... Stanford has some of the best programming courses in the nation, and when you sign up for it the first class you take is the one i posted links to... in fact you take 3 of those before you start learning a real language, that way you do not learn the words, because those change, but you instead learn the finer points and how it all works, that way you can write in any language you choose with little hassle...
so.. "Basically, what I'm saying is, you obviously have no clue what you're talking about. Please just stop trying to give people advice on things you don't understand yourself."